Some demon_log_* variables changed into logfile_* variables that are
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 9fac701..501a02e 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -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;
@@ -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' */
@@ -737,7 +735,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 +920,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;
@@ -1070,6 +1068,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 +1086,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 +1123,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",