X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/53936ef935e97d2036ad09b61b7040979d175469..4e90cfbfeda6d6956d547d9bed5c6763c9d596ba:/clientserver.c diff --git a/clientserver.c b/clientserver.c index 6da1138f..52913567 100644 --- a/clientserver.c +++ b/clientserver.c @@ -56,7 +56,7 @@ extern char *logfile_format; extern char *files_from; extern char *tmpdir; extern struct chmod_mode_struct *chmod_modes; -extern struct filter_list_struct server_filter_list; +extern struct filter_list_struct daemon_filter_list; extern char curr_dir[]; #ifdef ICONV_OPTION extern char *iconv_opt; @@ -214,7 +214,7 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char int sargc = 0; char *p, *modname; - assert(argc > 0); + assert(argc > 0 && *argv != NULL); if (**argv == '/') { rprintf(FERROR, @@ -505,19 +505,19 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) if ((p = strstr(module_dir, "/./")) != NULL) { *p = '\0'; p += 2; - } else if ((p = strdup("/")) == NULL) + } else if ((p = strdup("/")) == NULL) /* MEMORY LEAK */ out_of_memory("rsync_module"); } - /* We do a push_dir() that doesn't actually call chdir() + /* We do a change_dir() that doesn't actually call chdir() * just to make a relative path absolute. */ strlcpy(line, curr_dir, sizeof line); - if (!push_dir(module_dir, 1)) + if (!change_dir(module_dir, CD_SKIP_CHDIR)) goto chdir_failed; if (strcmp(curr_dir, module_dir) != 0 && (module_dir = strdup(curr_dir)) == NULL) out_of_memory("rsync_module"); - push_dir(line, 1); /* Restore curr_dir. */ + change_dir(line, CD_SKIP_CHDIR); /* Restore curr_dir. */ if (use_chroot) { chroot_path = module_dir; @@ -532,25 +532,25 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) set_filter_dir(module_dir, module_dirlen); p = lp_filter(i); - parse_rule(&server_filter_list, p, MATCHFLG_WORD_SPLIT, - XFLG_ABS_IF_SLASH); + parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT, + XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3); p = lp_include_from(i); - parse_filter_file(&server_filter_list, p, MATCHFLG_INCLUDE, - XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS); + parse_filter_file(&daemon_filter_list, p, MATCHFLG_INCLUDE, + XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS); p = lp_include(i); - parse_rule(&server_filter_list, p, + parse_rule(&daemon_filter_list, p, MATCHFLG_INCLUDE | MATCHFLG_WORD_SPLIT, - XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES); + XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES); p = lp_exclude_from(i); - parse_filter_file(&server_filter_list, p, 0, - XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS); + parse_filter_file(&daemon_filter_list, p, 0, + XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS); p = lp_exclude(i); - parse_rule(&server_filter_list, p, MATCHFLG_WORD_SPLIT, - XFLG_ABS_IF_SLASH | XFLG_OLD_PREFIXES); + parse_rule(&daemon_filter_list, p, MATCHFLG_WORD_SPLIT, + XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES); log_init(1); @@ -673,12 +673,12 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) io_printf(f_out, "@ERROR: chroot failed\n"); return -1; } - if (!push_dir(module_dir, 0)) + if (!change_dir(module_dir, CD_NORMAL)) goto chdir_failed; if (module_dirlen) sanitize_paths = 1; } else { - if (!push_dir(module_dir, 0)) { + if (!change_dir(module_dir, CD_NORMAL)) { chdir_failed: rsyserr(FLOG, errno, "chdir %s failed\n", module_dir); io_printf(f_out, "@ERROR: chdir failed\n"); @@ -691,7 +691,7 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) munge_symlinks = !use_chroot || module_dirlen; if (munge_symlinks) { STRUCT_STAT st; - if (stat(SYMLINK_PREFIX, &st) == 0 && S_ISDIR(st.st_mode)) { + if (do_stat(SYMLINK_PREFIX, &st) == 0 && S_ISDIR(st.st_mode)) { rprintf(FLOG, "Symlink munging is unsupported when a %s directory exists.\n", SYMLINK_PREFIX); io_printf(f_out, "@ERROR: daemon security issue -- contact admin\n", name);