From: Wayne Davison Date: Sat, 7 Aug 2004 20:56:41 +0000 (+0000) Subject: Fixed a bug in clean_fname() that could sometimes leave a "dir/.." X-Git-Tag: v2.6.3pre1~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e012b94f21da5dcf2043b3dc967e4723c7ba4b35;p=thirdparty%2Frsync.git Fixed a bug in clean_fname() that could sometimes leave a "dir/.." sequence uncollapsed. --- diff --git a/util.c b/util.c index a8787203..28a00ef8 100644 --- a/util.c +++ b/util.c @@ -652,7 +652,7 @@ size_t stringjoin(char *dest, size_t destsize, ...) unsigned int clean_fname(char *name) { - char *limit = name, *t = name, *f = name; + char *limit = name - 1, *t = name, *f = name; int anchored; if (!name) @@ -669,7 +669,7 @@ unsigned int clean_fname(char *name) if (*f == '.') { /* discard "." dirs (but NOT a trailing '.'!) */ if (f[1] == '/') { - f++; /* not += 2! */ + f += 2; continue; } /* collapse ".." dirs */ @@ -680,7 +680,7 @@ unsigned int clean_fname(char *name) continue; } while (s > limit && *--s != '/') {} - if (s != t - 1 && *s == '/') { + if (s != t - 1 && (s < name || *s == '/')) { t = s + 1; f += 2; continue;