X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/987a546756461b305120d08e379bd83c95fbc39b..f5aeb6ff9b04432a84b5c79f5baac26be1f3f4e9:/util.c diff --git a/util.c b/util.c index d8b3b26e..a4a08e7c 100644 --- a/util.c +++ b/util.c @@ -504,8 +504,8 @@ int lock_range(int fd, int offset, int len) } #define ENSURE_MEMSPACE(buf, type, sz, req) \ - if ((req) >= sz && !(buf = realloc_array(buf, type, sz *= 2))) \ - out_of_memory("ENSURE_MEMSPACE") + if ((req) > sz && !(buf = realloc_array(buf, type, sz = MAX(sz * 2, req)))) \ + out_of_memory("glob_expand") static inline void call_glob_match(const char *name, int len, int from_glob, char *arg, int abpos, int fbpos); @@ -522,14 +522,11 @@ static void glob_match(char *arg, int abpos, int fbpos) while (*arg == '.' && arg[1] == '/') { if (fbpos < 0) { - if (glob.fbsize < glob.absize) { - glob.filt_buf = realloc_array(glob.filt_buf, - char, glob.fbsize = glob.absize); - } + ENSURE_MEMSPACE(glob.filt_buf, char, glob.fbsize, glob.absize); memcpy(glob.filt_buf, glob.arg_buf, abpos + 1); fbpos = abpos; } - ENSURE_MEMSPACE(glob.arg_buf, char, glob.absize, abpos + 2); + ENSURE_MEMSPACE(glob.arg_buf, char, glob.absize, abpos + 3); glob.arg_buf[abpos++] = *arg++; glob.arg_buf[abpos++] = *arg++; glob.arg_buf[abpos] = '\0'; @@ -623,10 +620,11 @@ static inline void call_glob_match(const char *name, int len, int from_glob, } /* This routine performs wild-card expansion of the pathname in "arg". Any - * daemon-excluded files/dirs will not be matched by the wildcards. */ -void glob_expand(const char *arg, char ***argv_p, int *argc_p, int *maxargs_p) + * daemon-excluded files/dirs will not be matched by the wildcards. Returns 0 + * if a wild-card string is the only returned item (due to matching nothing). */ +int glob_expand(const char *arg, char ***argv_p, int *argc_p, int *maxargs_p) { - int save_argc; + int ret, save_argc; char *s; if (!arg) { @@ -634,7 +632,7 @@ void glob_expand(const char *arg, char ***argv_p, int *argc_p, int *maxargs_p) free(glob.filt_buf); free(glob.arg_buf); memset(&glob, 0, sizeof glob); - return; + return -1; } if (sanitize_paths) @@ -648,18 +646,14 @@ void glob_expand(const char *arg, char ***argv_p, int *argc_p, int *maxargs_p) | CFN_COLLAPSE_DOT_DOT_DIRS); } - if (glob.absize < MAXPATHLEN - && !(glob.arg_buf = realloc_array(glob.arg_buf, char, glob.absize = MAXPATHLEN))) - out_of_memory("glob_expand"); + ENSURE_MEMSPACE(glob.arg_buf, char, glob.absize, MAXPATHLEN); *glob.arg_buf = '\0'; glob.argc = save_argc = *argc_p; glob.argv = *argv_p; glob.maxargs = *maxargs_p; - if (glob.maxargs < MAX_ARGS - && !(glob.argv = realloc_array(glob.argv, char *, glob.maxargs = MAX_ARGS))) - out_of_memory("glob_expand"); + ENSURE_MEMSPACE(glob.argv, char *, glob.maxargs, 100); glob_match(s, 0, -1); @@ -667,12 +661,17 @@ void glob_expand(const char *arg, char ***argv_p, int *argc_p, int *maxargs_p) if (glob.argc == save_argc) { ENSURE_MEMSPACE(glob.argv, char *, glob.maxargs, glob.argc + 1); glob.argv[glob.argc++] = s; - } else + ret = 0; + } else { free(s); + ret = 1; + } *maxargs_p = glob.maxargs; *argv_p = glob.argv; *argc_p = glob.argc; + + return ret; } /* This routine is only used in daemon mode. */