If the server refuses a directory, don't allow any files to be
authorWayne Davison <wayned@samba.org>
Sat, 19 Feb 2005 23:01:52 +0000 (23:01 +0000)
committerWayne Davison <wayned@samba.org>
Sat, 19 Feb 2005 23:01:52 +0000 (23:01 +0000)
sent to the server inside that directory.

generator.c

index fe7f16b..bbf0e24 100644 (file)
@@ -344,7 +344,7 @@ static void recv_generator(char *fname, struct file_list *flist,
                           struct file_struct *file, int ndx,
                           int f_out, int f_out_name)
 {
-       static int missing_below = -1;
+       static int missing_below = -1, excluded_below = -1;
        static char *fuzzy_dirname = NULL;
        static struct file_list *fuzzy_dirlist = NULL;
        struct file_struct *fuzzy_file = NULL;
@@ -401,14 +401,24 @@ static void recv_generator(char *fname, struct file_list *flist,
                        safe_fname(fname), ndx);
        }
 
-       if (server_filter_list.head
-           && check_filter(&server_filter_list, fname,
-                           S_ISDIR(file->mode)) < 0) {
-               if (verbose) {
-                       rprintf(FINFO, "skipping server-excluded file \"%s\"\n",
-                               safe_fname(fname));
+       if (server_filter_list.head) {
+               if (excluded_below >= 0) {
+                       if (file->dir.depth > excluded_below)
+                               goto skipping;
+                       excluded_below = -1;
+               }
+               if (check_filter(&server_filter_list, fname,
+                                S_ISDIR(file->mode)) < 0) {
+                       if (S_ISDIR(file->mode))
+                               excluded_below = file->dir.depth;
+                   skipping:
+                       if (verbose) {
+                               rprintf(FINFO,
+                                       "skipping server-excluded file \"%s\"\n",
+                                       safe_fname(fname));
+                       }
+                       return;
                }
-               return;
        }
 
        if (missing_below >= 0 && file->dir.depth <= missing_below) {