summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/compat.c12
2 files changed, 16 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 641af5671..a5ac4f333 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-25 Peter Stephenson <p.stephenson@samsung.com>
+
+ * 44254: Src/compat.c: make quite sure we've reached "/"
+ in zgetdir(), else report an error.
+
2019-04-22 Matthew Martin <phy1729@gmail.com>
* unposted: Completion/Base/Utility/_pick_variant: Use
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) {