>From 579501476c880bff651ec3ea5d3116ae26c9941e Mon Sep 17 00:00:00 2001 From: Joakim Sindholt Date: Tue, 7 Mar 2017 10:31:37 +0100 Subject: [PATCH] fix nftw when called with paths ending in slash(es) --- src/misc/nftw.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/misc/nftw.c b/src/misc/nftw.c index efb2b89..d82b909 100644 --- a/src/misc/nftw.c +++ b/src/misc/nftw.c @@ -22,13 +22,13 @@ struct history static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h) { - size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l; + size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l, k; struct stat st; struct history new; int type; int r; struct FTW lev; - char *name; + char *end = 0; if ((flags & FTW_PHYS) ? lstat(path, &st) : stat(path, &st) < 0) { if (!(flags & FTW_PHYS) && errno==ENOENT && !lstat(path, &st)) @@ -53,13 +53,29 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, new.dev = st.st_dev; new.ino = st.st_ino; new.level = h ? h->level+1 : 0; - new.base = l+1; + new.base = j+1; lev.level = new.level; - lev.base = h ? h->base : (name=strrchr(path, '/')) ? name-path : 0; + if (h) { + lev.base = h->base; + } else { + lev.base = k = j; + while (k > 0 && path[k] == '/') + --k; + if (k > 0) { + end = path+k+1; + while (k > 0 && path[k-1] != '/') + --k; + lev.base = k; + } + } + if (end) + *end = '\0'; if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) return r; + if (end) + *end = '/'; for (; h; h = h->chain) if (h->dev == st.st_dev && h->ino == st.st_ino) -- 2.10.2