X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/cad8f6f980f4782a6113a5d3ea49ad8d8504aece..5a3810b4636f02a1276f8a39c28accdff8d664a3:/flist.c diff --git a/flist.c b/flist.c index 9fac701b..4f67463e 100644 --- a/flist.c +++ b/flist.c @@ -90,15 +90,15 @@ static int show_filelist_p(void) static void start_filelist_progress(char *kind) { - rprintf(FINFO, "%s ... ", kind); + rprintf(FCLIENT, "%s ... ", kind); if (verbose > 1 || do_progress) - rprintf(FINFO, "\n"); + rprintf(FCLIENT, "\n"); rflush(FINFO); } static void emit_filelist_progress(int count) { - rprintf(FINFO, " %d files...\r", count); + rprintf(FCLIENT, " %d files...\r", count); } static void maybe_emit_filelist_progress(int count) @@ -160,8 +160,6 @@ static void list_file_entry(struct file_struct *f) static int readlink_stat(const char *path, STRUCT_STAT *stp, char *linkbuf) { #ifdef SUPPORT_LINKS - if (copy_links) - return do_stat(path, stp); if (link_stat(path, stp, copy_dirlinks) < 0) return -1; if (S_ISLNK(stp->st_mode)) { @@ -174,7 +172,7 @@ static int readlink_stat(const char *path, STRUCT_STAT *stp, char *linkbuf) rprintf(FINFO,"copying unsafe symlink \"%s\" -> \"%s\"\n", path, linkbuf); } - return do_stat(path, stp); + return safe_stat(path, stp); } } return 0; @@ -187,12 +185,12 @@ int link_stat(const char *path, STRUCT_STAT *stp, int follow_dirlinks) { #ifdef SUPPORT_LINKS if (copy_links) - return do_stat(path, stp); + return safe_stat(path, stp); if (do_lstat(path, stp) < 0) return -1; if (follow_dirlinks && S_ISLNK(stp->st_mode)) { STRUCT_STAT st; - if (do_stat(path, &st) == 0 && S_ISDIR(st.st_mode)) + if (safe_stat(path, &st) == 0 && S_ISDIR(st.st_mode)) *stp = st; } return 0; @@ -284,7 +282,7 @@ void flist_expand(struct file_list *flist) flist->malloced); if (verbose >= 2 && flist->malloced != FLIST_START) { - rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n", + rprintf(FCLIENT, "[%s] expand file_list to %.0f bytes, did%s move\n", who_am_i(), (double)sizeof flist->files[0] * flist->malloced, (new_ptr == flist->files) ? " not" : ""); @@ -532,7 +530,7 @@ static struct file_struct *receive_file_entry(struct file_list *flist, clean_fname(thisname, 0); if (sanitize_paths) - sanitize_path(thisname, thisname, "", 0); + sanitize_path(thisname, thisname, "", 0, NULL); if ((basename = strrchr(thisname, '/')) != NULL) { dirname_len = ++basename - thisname; /* counts future '\0' */ @@ -657,6 +655,8 @@ static struct file_struct *receive_file_entry(struct file_list *flist, if (linkname_len) { file->u.link = bp; read_sbuf(f, bp, linkname_len - 1); + if (lp_munge_symlinks(module_id)) + sanitize_path(bp, bp, "", lastdir_depth, NULL); bp += linkname_len; } #endif @@ -737,7 +737,7 @@ struct file_struct *make_file(char *fname, struct file_list *flist, } clean_fname(thisname, 0); if (sanitize_paths) - sanitize_path(thisname, thisname, "", 0); + sanitize_path(thisname, thisname, "", 0, NULL); memset(sum, 0, SUM_LENGTH); @@ -922,7 +922,7 @@ struct file_struct *make_file(char *fname, struct file_list *flist, int save_mode = file->mode; file->mode = S_IFDIR; /* Find a directory with our name. */ if (flist_find(the_file_list, file) >= 0 - && do_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) { + && safe_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) { file->modtime = st2.st_mtime; file->length = st2.st_size; file->mode = st2.st_mode; @@ -1060,6 +1060,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) int64 start_write; int use_ff_fd = 0; + rprintf(FLOG, "building file list\n"); if (show_filelist_p()) start_filelist_progress("building file list"); @@ -1070,6 +1071,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) io_start_buffering_out(); if (filesfrom_fd >= 0) { + if (sanitize_paths) + die_on_unsafe_path(argv[0], 0); if (argv[0] && !push_dir(argv[0])) { rsyserr(FERROR, errno, "push_dir %s failed", full_fname(argv[0])); @@ -1086,13 +1089,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (use_ff_fd) { if (read_filesfrom_line(filesfrom_fd, fbuf) == 0) break; - sanitize_path(fbuf, fbuf, "", 0); + sanitize_path(fbuf, fbuf, "", 0, NULL); } else { if (argc-- == 0) break; strlcpy(fbuf, *argv++, MAXPATHLEN); if (sanitize_paths) - sanitize_path(fbuf, fbuf, "", 0); + sanitize_path(fbuf, fbuf, "", 0, NULL); } len = strlen(fbuf); @@ -1123,6 +1126,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) && (len == 1 || fbuf[len-2] == '/'); } + if (sanitize_paths) + die_on_unsafe_path(fbuf, 1); if (link_stat(fbuf, &st, copy_dirlinks) != 0) { io_error |= IOERR_GENERAL; rsyserr(FERROR, errno, "link_stat %s failed", @@ -1326,6 +1331,7 @@ struct file_list *recv_file_list(int f) unsigned short flags; int64 start_read; + rprintf(FLOG, "receiving file list\n"); if (show_filelist_p()) start_filelist_progress("receiving file list");