X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ad517ce5b33eb59873ec8468af704f43867cd8cb..66203a982b3d249bafda9b9272c4c103c19e4a9b:/clientserver.c diff --git a/clientserver.c b/clientserver.c index ace360b4..8c558075 100644 --- a/clientserver.c +++ b/clientserver.c @@ -25,6 +25,7 @@ extern int read_only; extern int verbose; extern int rsync_port; char *auth_user; +int sanitize_paths = 0; int start_socket_client(char *host, char *path, int argc, char *argv[]) { @@ -35,6 +36,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[]) char *p, *user=NULL; extern int remote_version; extern int am_sender; + extern struct in_addr socket_address; if (*path == '/') { rprintf(FERROR,"ERROR: The remote path must start with a module name\n"); @@ -51,7 +53,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[]) if (!user) user = getenv("USER"); if (!user) user = getenv("LOGNAME"); - fd = open_socket_out(host, rsync_port); + fd = open_socket_out(host, rsync_port, &socket_address); if (fd == -1) { exit_cleanup(RERR_SOCKETIO); } @@ -99,7 +101,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[]) } io_printf(fd,"\n"); - if (remote_version > 17 && !am_sender) + if (remote_version >= 22 || (remote_version > 17 && !am_sender)) io_start_multiplex_in(fd); return client_run(fd, fd, -1, argc, argv); @@ -221,6 +223,7 @@ static int rsync_module(int fd, int i) io_printf(fd,"@ERROR: chdir failed\n"); return -1; } + sanitize_paths = 1; } if (am_root) { @@ -262,7 +265,7 @@ static int rsync_module(int fd, int i) request = strdup(p); start_glob++; } - glob_expand(name, argv, &argc, MAX_ARGS, !use_chroot); + glob_expand(name, argv, &argc, MAX_ARGS); } else { argc++; } @@ -276,7 +279,7 @@ static int rsync_module(int fd, int i) } } - if (!use_chroot) { + if (sanitize_paths) { /* * Note that this is applied to all parameters, whether or not * they are filenames, but no other legal parameters contain @@ -285,7 +288,7 @@ static int rsync_module(int fd, int i) * and which aren't. */ for (i = 1; i < argc; i++) { - sanitize_path(argv[i]); + sanitize_path(argv[i], NULL); } } @@ -313,9 +316,17 @@ static int rsync_module(int fd, int i) argp = argv + optind; optind = 0; - if (remote_version > 17 && am_sender) + if (remote_version >= 22 || (remote_version > 17 && am_sender)) io_start_multiplex_out(fd); + if (read_only) { + extern int am_sender; + if (!am_sender) { + rprintf(FERROR,"ERROR: module is read only\n"); + return -1; + } + } + if (!ret) { option_error(); } @@ -431,8 +442,6 @@ int daemon_main(void) open("/dev/null", O_RDWR); } - set_nonblocking(STDIN_FILENO); - return start_daemon(STDIN_FILENO); }