diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/compat.c | 12 |
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) { |