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