From d4972af12c29bded4706464dbae3458e5a425d00 Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Thu, 25 Apr 2019 17:08:43 +0100
Subject: 44254: Handle error case in zgetdir().
When retrieving path to current directory by looking for /,
ensure we have actually reached / by comparing inode.
If the current directory became invalid on some OSes including
Linux the parent directory is valid but is the same as the
current one.
---
Src/compat.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
(limited to 'Src')
diff --git a/Src/compat.c b/Src/compat.c
index 7b5c4411c..7131d91a4 100644
--- a/Src/compat.c
+++ b/Src/compat.c
@@ -361,8 +361,18 @@ zgetdir(struct dirsav *d)
pino = sbuf.st_ino;
pdev = sbuf.st_dev;
- /* If they're the same, we've reached the root directory. */
+ /* If they're the same, we've reached the root directory... */
if (ino == pino && dev == pdev) {
+ /*
+ * ...well, probably. If this was an orphaned . after
+ * an unmount, or something such, we could be in trouble...
+ */
+ if (stat("/", &sbuf) < 0 ||
+ sbuf.st_ino != ino ||
+ sbuf.st_dev != dev) {
+ zerr("Failed to get current directory: path invalid");
+ return NULL;
+ }
if (!buf[pos])
buf[--pos] = '/';
if (d) {
--
cgit 1.4.1