X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ea124cb324be2dffb97fe44fa534b24a3060479d..dfe1ed5e97be175a7a95aba6a334744d59df4af5:/flist.c diff --git a/flist.c b/flist.c index ad859bc4..16c95aba 100644 --- a/flist.c +++ b/flist.c @@ -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 (lp_munge_symlinks(module_id)) + sanitize_path(bp, bp, "", lastdir_depth, NULL); bp += linkname_len; } #endif @@ -1071,7 +1073,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) 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); @@ -1183,6 +1185,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 +1211,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));