Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
82c6be7
)
Simplified sanitize_path() logic a little.
author
Wayne Davison
<wayned@samba.org>
Thu, 12 Aug 2004 09:32:16 +0000
(09:32 +0000)
committer
Wayne Davison
<wayned@samba.org>
Thu, 12 Aug 2004 09:32:16 +0000
(09:32 +0000)
util.c
patch
|
blob
|
blame
|
history
diff --git
a/util.c
b/util.c
index
03134e9
..
5243c74
100644
(file)
--- a/
util.c
+++ b/
util.c
@@
-740,7
+740,6
@@
unsigned int clean_fname(char *name)
char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
{
char *start, *sanp;
char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
{
char *start, *sanp;
- int allowdotdot = 0;
int rlen = 0;
if (dest != p) {
int rlen = 0;
if (dest != p) {
@@
-765,59
+764,45
@@
char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
}
start = sanp = dest + rlen;
}
start = sanp = dest + rlen;
- while (*p == '/') {
- /* remove leading slashes */
- p++;
- }
while (*p != '\0') {
while (*p != '\0') {
+ /* discard leading or extra slashes */
+ if (*p == '/') {
+ p++;
+ continue;
+ }
/* this loop iterates once per filename component in p.
* both p (and sanp if the original had a slash) should
* always be left pointing after a slash
*/
if (*p == '.' && (p[1] == '/' || p[1] == '\0')) {
/* skip "." component */
/* this loop iterates once per filename component in p.
* both p (and sanp if the original had a slash) should
* always be left pointing after a slash
*/
if (*p == '.' && (p[1] == '/' || p[1] == '\0')) {
/* skip "." component */
- while (*++p == '/') {
- /* skip following slashes */
- ;
- }
+ p++;
continue;
}
continue;
}
- allowdotdot = 0;
if (*p == '.' && p[1] == '.' && (p[2] == '/' || p[2] == '\0')) {
/* ".." component followed by slash or end */
if (depth > 0 && sanp == start) {
/* allow depth levels of .. at the beginning */
--depth;
if (*p == '.' && p[1] == '.' && (p[2] == '/' || p[2] == '\0')) {
/* ".." component followed by slash or end */
if (depth > 0 && sanp == start) {
/* allow depth levels of .. at the beginning */
--depth;
- allowdotdot = 1;
- } else {
- p += 2;
- while (*p == '/') p++;
- if (sanp != start) {
- /* back up sanp one level */
- --sanp; /* now pointing at slash */
- while (sanp > start && sanp[-1] != '/') {
- /* skip back up to slash */
- sanp--;
- }
- }
+ *sanp++ = *p++;
+ *sanp++ = *p++;
+ /* move virtual beginning to leave .. alone */
+ start = sanp;
continue;
}
continue;
}
- }
- while (1) {
- /* copy one component through next slash */
- *sanp++ = *p++;
- if (*p == '\0' || p[-1] == '/') {
- while (*p == '/') {
- /* skip multiple slashes */
- p++;
+ p += 2;
+ if (sanp != start) {
+ /* back up sanp one level */
+ --sanp; /* now pointing at slash */
+ while (sanp > start && sanp[-1] != '/') {
+ /* skip back up to slash */
+ sanp--;
}
}
- break;
}
}
+ continue;
}
}
- if (allowdotdot) {
- /* move the virtual beginning to leave the .. alone */
- start = sanp;
- }
+ /* copy one component through next slash */
+ while (*p && (*sanp++ = *p++) != '/') {}
}
if (sanp == dest) {
/* ended up with nothing, so put in "." component */
}
if (sanp == dest) {
/* ended up with nothing, so put in "." component */