X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ea124cb324be2dffb97fe44fa534b24a3060479d..b1b54199efeba50d29a6ba8025ee8c8193d16dda:/flist.c diff --git a/flist.c b/flist.c index ad859bc4..0366d9eb 100644 --- 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));