X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/62c9e6b3a54f147629497a2bc791acac60b5668b..495723bb26632d78c7693799491fb3b9c3b326be:/util.c diff --git a/util.c b/util.c index cb47c2a1..fd630099 100644 --- a/util.c +++ b/util.c @@ -476,7 +476,8 @@ static int exclude_server_path(char *arg) if (server_exclude_list) { for (s = arg; (s = strchr(s, '/')) != NULL; ) { *s = '\0'; - if (check_exclude(server_exclude_list, arg, 1)) { + if (check_exclude(server_exclude_list, arg, 1, + "server pattern")) { /* We must leave arg truncated! */ return 1; } @@ -775,6 +776,34 @@ void sanitize_path(char *p, char *reldir) *sanp = '\0'; } +/* Works much like sanitize_path(), with these differences: (1) a new buffer + * is allocated for the sanitized path rather than modifying it in-place; (2) + * a leading slash gets transformed into the rootdir value (which can be empty + * or NULL if you just want the slash to get dropped); (3) no "reldir" can be + * specified. */ +char *alloc_sanitize_path(const char *path, const char *rootdir) +{ + char *buf; + int rlen, plen = strlen(path); + + if (*path == '/' && rootdir) + rlen = strlen(rootdir); + else + rlen = 0; + if (!(buf = new_array(char, rlen + plen + 1))) + out_of_memory("alloc_sanitize_path"); + if (rlen) + memcpy(buf, rootdir, rlen); + memcpy(buf + rlen, path, plen + 1); + + if (rlen) + rlen++; + sanitize_path(buf + rlen, NULL); + if (rlen && buf[rlen] == '.' && buf[rlen+1] == '\0') + buf[rlen-1] = '\0'; + + return buf; +} char curr_dir[MAXPATHLEN]; unsigned int curr_dir_len;