Removed the changes in symlink handling in non-chroot daemon mode as
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index ad859bc..0366d9e 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -172,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 safe_stat(path, stp);
+                       return do_stat(path, stp);
                }
        }
        return 0;
@@ -185,12 +185,12 @@ int link_stat(const char *path, STRUCT_STAT *stp, int follow_dirlinks)
 {
 #ifdef SUPPORT_LINKS
        if (copy_links)
-               return safe_stat(path, stp);
+               return do_stat(path, stp);
        if (do_lstat(path, stp) < 0)
                return -1;
        if (follow_dirlinks && S_ISLNK(stp->st_mode)) {
                STRUCT_STAT st;
-               if (safe_stat(path, &st) == 0 && S_ISDIR(st.st_mode))
+               if (do_stat(path, &st) == 0 && S_ISDIR(st.st_mode))
                        *stp = st;
        }
        return 0;
@@ -314,7 +314,7 @@ static void send_file_entry(struct file_struct *file, int f)
        if (!file) {
                write_byte(f, 0);
                modtime = 0, mode = 0;
-               dev = 0, rdev = makedev(0, 0);
+               dev = 0, rdev = MAKEDEV(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
                *lastname = '\0';
@@ -346,7 +346,7 @@ static void send_file_entry(struct file_struct *file, int f)
                                flags |= XMIT_RDEV_MINOR_IS_SMALL;
                }
        } else if (protocol_version < 28)
-               rdev = makedev(0, 0);
+               rdev = MAKEDEV(0, 0);
        if (file->uid == uid)
                flags |= XMIT_SAME_UID;
        else
@@ -497,7 +497,7 @@ static struct file_struct *receive_file_entry(struct file_list *flist,
 
        if (!flist) {
                modtime = 0, mode = 0;
-               dev = 0, rdev = makedev(0, 0);
+               dev = 0, rdev = MAKEDEV(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
                *lastname = '\0';
@@ -574,10 +574,10 @@ static struct file_struct *receive_file_entry(struct file_list *flist,
                                rdev_minor = read_byte(f);
                        else
                                rdev_minor = read_int(f);
-                       rdev = makedev(rdev_major, rdev_minor);
+                       rdev = MAKEDEV(rdev_major, rdev_minor);
                }
        } else if (protocol_version < 28)
-               rdev = makedev(0, 0);
+               rdev = MAKEDEV(0, 0);
 
 #ifdef SUPPORT_LINKS
        if (preserve_links && S_ISLNK(mode)) {
@@ -655,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 (sanitize_paths)
+                       sanitize_path(bp, bp, "", lastdir_depth, NULL);
                bp += linkname_len;
        }
 #endif
@@ -920,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
-                   && safe_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) {
+                   && do_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) {
                        file->modtime = st2.st_mtime;
                        file->length = st2.st_size;
                        file->mode = st2.st_mode;
@@ -1069,9 +1071,7 @@ 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])) {
+               if (argv[0] && !push_dir(argv[0], 0)) {
                        rsyserr(FERROR, errno, "push_dir %s failed",
                                full_fname(argv[0]));
                        exit_cleanup(RERR_FILESELECT);
@@ -1124,8 +1124,6 @@ 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",
@@ -1183,6 +1181,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                                } else
                                        break;
                        }
+                       if (len == 1 && fn[0] == '/')
+                               fn[len++] = '.';
                        fn[len] = '\0';
                        /* Reject a ".." dir in the active part of the path. */
                        for (p = fn; (p = strstr(p, "..")) != NULL; p += 2) {
@@ -1207,7 +1207,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
 
                        strlcpy(olddir, curr_dir, sizeof olddir);
 
-                       if (!push_dir(dir)) {
+                       if (!push_dir(dir, 0)) {
                                io_error |= IOERR_GENERAL;
                                rsyserr(FERROR, errno, "push_dir %s failed",
                                        full_fname(dir));