Fixed the check_filter() calls that might be checking an absolute path
authorWayne Davison <wayned@samba.org>
Sun, 16 Dec 2007 22:16:37 +0000 (14:16 -0800)
committerWayne Davison <wayned@samba.org>
Sun, 16 Dec 2007 22:16:37 +0000 (14:16 -0800)
in "use chroot = no" mode against a daemon's exclude restriction.

main.c
options.c

diff --git a/main.c b/main.c
index b2dcb52..ba47048 100644 (file)
--- a/main.c
+++ b/main.c
@@ -65,6 +65,7 @@ extern int batch_fd;
 extern int filesfrom_fd;
 extern int connect_timeout;
 extern pid_t cleanup_child_pid;
 extern int filesfrom_fd;
 extern int connect_timeout;
 extern pid_t cleanup_child_pid;
+extern unsigned int module_dirlen;
 extern struct stats stats;
 extern char *filesfrom_host;
 extern char *partial_dir;
 extern struct stats stats;
 extern char *filesfrom_host;
 extern char *partial_dir;
@@ -332,7 +333,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
        int i, argc = 0;
        char *args[MAX_ARGS];
        pid_t ret;
        int i, argc = 0;
        char *args[MAX_ARGS];
        pid_t ret;
-       char *dir = NULL;
        int dash_l_set = 0;
 
        if (!read_batch && !local_server) {
        int dash_l_set = 0;
 
        if (!read_batch && !local_server) {
@@ -508,9 +508,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
                        ret = piped_child(args, f_in_p, f_out_p);
        }
 
                        ret = piped_child(args, f_in_p, f_out_p);
        }
 
-       if (dir)
-               free(dir);
-
        return ret;
 
   oom:
        return ret;
 
   oom:
@@ -869,7 +866,6 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
        int exit_code;
        struct file_list *flist;
        char *local_name = NULL;
        int exit_code;
        struct file_list *flist;
        char *local_name = NULL;
-       char *dir = NULL;
        int save_verbose = verbose;
 
        if (filesfrom_fd >= 0) {
        int save_verbose = verbose;
 
        if (filesfrom_fd >= 0) {
@@ -890,7 +886,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
        }
 
        if (argc > 0) {
        }
 
        if (argc > 0) {
-               dir = argv[0];
+               char *dir = argv[0];
                argc--;
                argv++;
                if (!am_daemon && !push_dir(dir, 0)) {
                argc--;
                argv++;
                if (!am_daemon && !push_dir(dir, 0)) {
@@ -940,15 +936,18 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
        check_alt_basis_dirs();
 
        if (server_filter_list.head) {
        check_alt_basis_dirs();
 
        if (server_filter_list.head) {
-               char **dir;
+               char **dir_p;
                struct filter_list_struct *elp = &server_filter_list;
 
                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 == '/'
                                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");
                    options_rejected:
                        rprintf(FERROR,
                                "Your options have been rejected by the server.\n");
index d3846de..11249c0 100644 (file)
--- a/options.c
+++ b/options.c
@@ -27,6 +27,7 @@
 extern int module_id;
 extern int sanitize_paths;
 extern int daemon_over_rsh;
 extern int module_id;
 extern int sanitize_paths;
 extern int daemon_over_rsh;
+extern unsigned int module_dirlen;
 extern struct filter_list_struct filter_list;
 extern struct filter_list_struct server_filter_list;
 
 extern struct filter_list_struct filter_list;
 extern struct filter_list_struct server_filter_list;
 
@@ -1007,13 +1008,14 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
                                arg = sanitize_path(NULL, arg, NULL, 0);
                        if (server_filter_list.head) {
                                int rej;
                                arg = sanitize_path(NULL, arg, NULL, 0);
                        if (server_filter_list.head) {
                                int rej;
-                               char *cp = strdup(arg);
+                               char *dir, *cp = strdup(arg);
                                if (!cp)
                                        out_of_memory("parse_arguments");
                                if (!*cp)
                                        goto options_rejected;
                                if (!cp)
                                        out_of_memory("parse_arguments");
                                if (!*cp)
                                        goto options_rejected;
-                               clean_fname(cp, CFN_COLLAPSE_DOT_DOT_DIRS);
-                               rej = check_filter(&server_filter_list, cp, 0) < 0;
+                               dir = cp + (*cp == '/' ? module_dirlen : 0);
+                               clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                               rej = check_filter(&server_filter_list, dir, 0) < 0;
                                free(cp);
                                if (rej)
                                        goto options_rejected;
                                free(cp);
                                if (rej)
                                        goto options_rejected;
@@ -1406,17 +1408,21 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
        if (server_filter_list.head && !am_sender) {
                struct filter_list_struct *elp = &server_filter_list;
                if (tmpdir) {
        if (server_filter_list.head && !am_sender) {
                struct filter_list_struct *elp = &server_filter_list;
                if (tmpdir) {
+                       char *dir;
                        if (!*tmpdir)
                                goto options_rejected;
                        if (!*tmpdir)
                                goto options_rejected;
-                       clean_fname(tmpdir, CFN_COLLAPSE_DOT_DOT_DIRS);
-                       if (check_filter(elp, tmpdir, 1) < 0)
+                       dir = tmpdir + (*tmpdir == '/' ? module_dirlen : 0);
+                       clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                       if (check_filter(elp, dir, 1) < 0)
                                goto options_rejected;
                }
                if (backup_dir) {
                                goto options_rejected;
                }
                if (backup_dir) {
+                       char *dir;
                        if (!*backup_dir)
                                goto options_rejected;
                        if (!*backup_dir)
                                goto options_rejected;
-                       clean_fname(backup_dir, CFN_COLLAPSE_DOT_DOT_DIRS);
-                       if (check_filter(elp, backup_dir, 1) < 0)
+                       dir = backup_dir + (*backup_dir == '/' ? module_dirlen : 0);
+                       clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                       if (check_filter(elp, dir, 1) < 0)
                                goto options_rejected;
                }
        }
                                goto options_rejected;
                }
        }
@@ -1607,10 +1613,12 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
                        if (sanitize_paths)
                                files_from = sanitize_path(NULL, files_from, NULL, 0);
                        if (server_filter_list.head) {
                        if (sanitize_paths)
                                files_from = sanitize_path(NULL, files_from, NULL, 0);
                        if (server_filter_list.head) {
+                               char *dir;
                                if (!*files_from)
                                        goto options_rejected;
                                if (!*files_from)
                                        goto options_rejected;
-                               clean_fname(files_from, CFN_COLLAPSE_DOT_DOT_DIRS);
-                               if (check_filter(&server_filter_list, files_from, 0) < 0)
+                               dir = files_from + (*files_from == '/' ? module_dirlen : 0);
+                               clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
+                               if (check_filter(&server_filter_list, dir, 0) < 0)
                                        goto options_rejected;
                        }
                        filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);
                                        goto options_rejected;
                        }
                        filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);