Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixed a bug in clean_fname() that could sometimes leave a "dir/.."
[rsync/rsync.git]
/
util.c
diff --git
a/util.c
b/util.c
index
96b7ac4
..
28a00ef
100644
(file)
--- a/
util.c
+++ b/
util.c
@@
-650,13
+650,13
@@
size_t stringjoin(char *dest, size_t destsize, ...)
return ret;
}
return ret;
}
-
void
clean_fname(char *name)
+
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)
int anchored;
if (!name)
- return;
+ return
0
;
if ((anchored = *f == '/') != 0)
*t++ = *f++;
if ((anchored = *f == '/') != 0)
*t++ = *f++;
@@
-669,7
+669,7
@@
void clean_fname(char *name)
if (*f == '.') {
/* discard "." dirs (but NOT a trailing '.'!) */
if (f[1] == '/') {
if (*f == '.') {
/* discard "." dirs (but NOT a trailing '.'!) */
if (f[1] == '/') {
- f
++; /* not += 2! */
+ f
+= 2;
continue;
}
/* collapse ".." dirs */
continue;
}
/* collapse ".." dirs */
@@
-680,7
+680,7
@@
void clean_fname(char *name)
continue;
}
while (s > limit && *--s != '/') {}
continue;
}
while (s > limit && *--s != '/') {}
- if (s != t - 1 &&
*s == '/'
) {
+ if (s != t - 1 &&
(s < name || *s == '/')
) {
t = s + 1;
f += 2;
continue;
t = s + 1;
f += 2;
continue;
@@
-698,6
+698,8
@@
void clean_fname(char *name)
if (t == name)
*t++ = '.';
*t = '\0';
if (t == name)
*t++ = '.';
*t = '\0';
+
+ return t - name;
}
/* Make path appear as if a chroot had occurred. This handles a leading
}
/* Make path appear as if a chroot had occurred. This handles a leading
@@
-867,7
+869,7
@@
int push_dir(char *dir)
curr_dir_len += len;
}
curr_dir_len += len;
}
- clean_fname(curr_dir);
+ c
urr_dir_len = c
lean_fname(curr_dir);
return 1;
}
return 1;
}