--- a/main.c +++ b/main.c @@ -61,6 +61,7 @@ extern int batch_fd; extern int batch_gen_fd; extern int filesfrom_fd; extern pid_t cleanup_child_pid; +extern unsigned int module_dirlen; extern struct stats stats; extern char *filesfrom_host; extern char *partial_dir; @@ -852,15 +853,18 @@ static void do_server_recv(int f_in, int fix_basis_dirs(); if (server_filter_list.head) { - char **dir; + char **dir_p; struct filter_list_struct *elp = &server_filter_list; - for (dir = basis_dir; *dir; dir++) { - if (check_filter(elp, *dir, 1) < 0) + for (dir_p = basis_dir; *dir_p; dir_p++) { + char *dir = *dir_p; + if (*dir == '/') + dir += module_dirlen; + if (check_filter(elp, dir, 1) < 0) goto options_rejected; } if (partial_dir && *partial_dir == '/' - && check_filter(elp, partial_dir, 1) < 0) { + && check_filter(elp, partial_dir + module_dirlen, 1) < 0) { options_rejected: rprintf(FERROR, "Your options have been rejected by the server.\n"); --- a/options.c +++ b/options.c @@ -26,6 +26,7 @@ extern int module_id; extern int sanitize_paths; +extern unsigned int module_dirlen; extern struct filter_list_struct filter_list; extern struct filter_list_struct server_filter_list; @@ -912,13 +913,14 @@ int parse_arguments(int *argc, const cha if (sanitize_paths) arg = sanitize_path(NULL, arg, NULL, 0, NULL); if (server_filter_list.head) { - char *cp = strdup(arg); + char *dir, *cp = strdup(arg); if (!cp) out_of_memory("parse_arguments"); if (!*cp) goto options_rejected; - clean_fname(cp, 1); - if (check_filter(&server_filter_list, cp, 0) < 0) + dir = cp + (*cp == '/' ? module_dirlen : 0); + clean_fname(dir, 1); + if (check_filter(&server_filter_list, dir, 0) < 0) goto options_rejected; free(cp); } @@ -1236,17 +1238,21 @@ int parse_arguments(int *argc, const cha if (server_filter_list.head && !am_sender) { struct filter_list_struct *elp = &server_filter_list; if (tmpdir) { + char *dir; if (!*tmpdir) goto options_rejected; - clean_fname(tmpdir, 1); - if (check_filter(elp, tmpdir, 1) < 0) + dir = tmpdir + (*tmpdir == '/' ? module_dirlen : 0); + clean_fname(dir, 1); + if (check_filter(elp, dir, 1) < 0) goto options_rejected; } if (backup_dir) { + char *dir; if (!*backup_dir) goto options_rejected; - clean_fname(backup_dir, 1); - if (check_filter(elp, backup_dir, 1) < 0) { + dir = backup_dir + (*backup_dir == '/' ? module_dirlen : 0); + clean_fname(dir, 1); + if (check_filter(elp, dir, 1) < 0) { options_rejected: snprintf(err_buf, sizeof err_buf, "Your options have been rejected by the server.\n"); @@ -1438,10 +1444,12 @@ int parse_arguments(int *argc, const cha if (sanitize_paths) files_from = sanitize_path(NULL, files_from, NULL, 0, NULL); if (server_filter_list.head) { + char *dir; if (!*files_from) goto options_rejected; - clean_fname(files_from, 1); - if (check_filter(&server_filter_list, files_from, 0) < 0) + dir = files_from + (*files_from == '/' ? module_dirlen : 0); + clean_fname(dir, 1); + if (check_filter(&server_filter_list, dir, 0) < 0) goto options_rejected; } filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);