Allow the argv list the daemon uses for globbing its args to grow.
authorWayne Davison <wayned@samba.org>
Wed, 9 Jun 2004 21:51:07 +0000 (21:51 +0000)
committerWayne Davison <wayned@samba.org>
Wed, 9 Jun 2004 21:51:07 +0000 (21:51 +0000)
clientserver.c
util.c

index 9f51406..501e6e4 100644 (file)
@@ -207,7 +207,8 @@ int start_inband_exchange(char *user, char *path, int f_in, int f_out, int argc)
 static int rsync_module(int f_in, int f_out, int i)
 {
        int argc = 0;
-       char *argv[MAX_ARGS];
+       int maxargs;
+       char **argv;
        char **argp;
        char line[MAXPATHLEN];
        uid_t uid = (uid_t)-2;  /* canonically "nobody" */
@@ -385,6 +386,9 @@ static int rsync_module(int f_in, int f_out, int i)
 
        io_printf(f_out, "@RSYNCD: OK\n");
 
+       maxargs = MAX_ARGS;
+       if (!(argv = new_array(char *, maxargs)))
+               out_of_memory("rsync_module");
        argv[argc++] = "rsyncd";
 
        while (1) {
@@ -396,23 +400,25 @@ static int rsync_module(int f_in, int f_out, int i)
 
                p = line;
 
+               if (argc == maxargs) {
+                       maxargs += MAX_ARGS;
+                       if (!(argv = realloc_array(argv, char *, maxargs)))
+                               out_of_memory("rsync_module");
+               }
                if (!(argv[argc] = strdup(p)))
-                       return -1;
+                       out_of_memory("rsync_module");
 
                if (start_glob) {
                        if (start_glob == 1) {
                                request = strdup(p);
                                start_glob++;
                        }
-                       glob_expand(name, argv, &argc, MAX_ARGS);
+                       glob_expand(name, &argv, &argc, &maxargs);
                } else
                        argc++;
 
                if (strcmp(line, ".") == 0)
                        start_glob = 1;
-
-               if (argc == MAX_ARGS)
-                       return -1;
        }
 
        argp = argv;
diff --git a/util.c b/util.c
index f2158a0..8d05771 100644 (file)
--- a/util.c
+++ b/util.c
@@ -495,12 +495,20 @@ static int exclude_server_path(char *arg)
        return 0;
 }
 
-static void glob_expand_one(char *s, char **argv, int *argc_ptr, int maxargs)
+static void glob_expand_one(char *s, char ***argv_ptr, int *argc_ptr,
+                           int *maxargs_ptr)
 {
+       char **argv = *argv_ptr;
        int argc = *argc_ptr;
+       int maxargs = *maxargs_ptr;
 #if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
-       if (maxargs <= argc)
-               return;
+       if (argc == maxargs) {
+               maxargs += MAX_ARGS;
+               if (!(argv = realloc_array(argv, char *, maxargs)))
+                       out_of_memory("glob_expand_one");
+               *argv_ptr = argv;
+               *maxargs_ptr = maxargs;
+       }
        if (!*s)
                s = ".";
        s = argv[argc++] = strdup(s);
@@ -521,12 +529,17 @@ static void glob_expand_one(char *s, char **argv, int *argc_ptr, int maxargs)
        memset(&globbuf, 0, sizeof globbuf);
        if (!exclude_server_path(s))
                glob(s, 0, NULL, &globbuf);
+       if (MAX((int)globbuf.gl_pathc, 1) > maxargs - argc) {
+               maxargs += globbuf.gl_pathc + MAX_ARGS;
+               if (!(argv = realloc_array(argv, char *, maxargs)))
+                       out_of_memory("glob_expand_one");
+               *argv_ptr = argv;
+               *maxargs_ptr = maxargs;
+       }
        if (globbuf.gl_pathc == 0)
                argv[argc++] = s;
        else {
                int j = globbuf.gl_pathc;
-               if (j > maxargs - argc)
-                       j = maxargs - argc;
                free(s);
                for (i = 0; i < j; i++) {
                        if (!(argv[argc++] = strdup(globbuf.gl_pathv[i])))
@@ -539,9 +552,9 @@ static void glob_expand_one(char *s, char **argv, int *argc_ptr, int maxargs)
 }
 
 /* This routine is only used in daemon mode. */
-void glob_expand(char *base1, char **argv, int *argc_ptr, int maxargs)
+void glob_expand(char *base1, char ***argv_ptr, int *argc_ptr, int *maxargs_ptr)
 {
-       char *s = argv[*argc_ptr];
+       char *s = (*argv_ptr)[*argc_ptr];
        char *p, *q;
        char *base = base1;
        int base_len = strlen(base);
@@ -562,7 +575,7 @@ void glob_expand(char *base1, char **argv, int *argc_ptr, int maxargs)
        for (q = s; *q; q = p + base_len) {
                if ((p = strstr(q, base)) != NULL)
                        *p = '\0'; /* split it at this point */
-               glob_expand_one(q, argv, argc_ptr, maxargs);
+               glob_expand_one(q, argv_ptr, argc_ptr, maxargs_ptr);
                if (!p)
                        break;
        }