X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/9127013998bd097f699897b0f2b142fe2ba71e9d..0ef5abcbbb95298fa9faf1d3eb275a9e76e1d951:/remote-option.diff diff --git a/remote-option.diff b/remote-option.diff index 481361a..481390d 100644 --- a/remote-option.diff +++ b/remote-option.diff @@ -25,7 +25,7 @@ diff --git a/options.c b/options.c int verbose = 0; int quiet = 0; int output_motd = 1; -@@ -387,6 +391,7 @@ void usage(enum logcode F) +@@ -388,6 +392,7 @@ void usage(enum logcode F) rprintf(F," --timeout=SECONDS set I/O timeout in seconds\n"); rprintf(F," --contimeout=SECONDS set daemon connection timeout in seconds\n"); rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n"); @@ -33,7 +33,7 @@ diff --git a/options.c b/options.c rprintf(F," --size-only skip files that match in size\n"); rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n"); rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n"); -@@ -645,6 +650,7 @@ static struct poptOption long_options[] = { +@@ -646,6 +651,7 @@ static struct poptOption long_options[] = { {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 }, {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 }, @@ -41,7 +41,7 @@ diff --git a/options.c b/options.c {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, {"checksum-seed", 0, POPT_ARG_INT, &checksum_seed, 0, 0, 0 }, {"server", 0, POPT_ARG_NONE, 0, OPT_SERVER, 0, 0 }, -@@ -1140,6 +1146,26 @@ int parse_arguments(int *argc_p, const char ***argv_p) +@@ -1141,6 +1147,26 @@ int parse_arguments(int *argc_p, const char ***argv_p) } break; @@ -52,7 +52,7 @@ diff --git a/options.c b/options.c + "Remote option must start with a dash: %s\n", arg); + return 0; + } -+ if (remote_option_cnt+3 > remote_option_alloc) { ++ if (remote_option_cnt+2 >= remote_option_alloc) { + remote_option_alloc += 16; + remote_options = realloc_array(remote_options, + const char *, remote_option_alloc); @@ -68,27 +68,10 @@ diff --git a/options.c b/options.c case OPT_WRITE_BATCH: /* batch_name is already set */ write_batch = 1; -@@ -1826,6 +1852,11 @@ void server_options(char **args, int *argc_p) - #endif - argstr[x] = '\0'; - -+ if (x > (int)sizeof argstr) { /* Not possible... */ -+ rprintf(FERROR, "argstr overflow in server_options().\n"); -+ exit_cleanup(RERR_MALLOC); -+ } -+ - args[ac++] = argstr; - - #ifdef ICONV_OPTION -@@ -2048,6 +2079,21 @@ void server_options(char **args, int *argc_p) +@@ -2063,6 +2089,16 @@ void server_options(char **args, int *argc_p) else if (remove_source_files) args[ac++] = "--remove-sent-files"; -+ if (ac > MAX_SERVER_ARGS) { /* Not possible... */ -+ rprintf(FERROR, "argc overflow in server_options().\n"); -+ exit_cleanup(RERR_MALLOC); -+ } -+ + if (remote_option_cnt) { + int j; + if (ac + remote_option_cnt > MAX_SERVER_ARGS) { @@ -99,9 +82,9 @@ diff --git a/options.c b/options.c + args[ac++] = (char*)remote_options[j]; + } + - *argc_p = ac; - return; - + if (ac > MAX_SERVER_ARGS) { /* Not possible... */ + rprintf(FERROR, "argc overflow in server_options().\n"); + exit_cleanup(RERR_MALLOC); diff --git a/pipe.c b/pipe.c --- a/pipe.c +++ b/pipe.c @@ -133,7 +116,7 @@ diff --git a/pipe.c b/pipe.c diff --git a/rsync.yo b/rsync.yo --- a/rsync.yo +++ b/rsync.yo -@@ -412,6 +412,7 @@ to the detailed description below for a complete description. verb( +@@ -416,6 +416,7 @@ to the detailed description below for a complete description. verb( --progress show progress during transfer -P same as --partial --progress -i, --itemize-changes output a change-summary for all updates @@ -141,7 +124,7 @@ diff --git a/rsync.yo b/rsync.yo --out-format=FORMAT output updates using the specified FORMAT --log-file=FILE log what we're doing to the specified FILE --log-file-format=FMT log updates using the specified FMT -@@ -1026,16 +1027,16 @@ This is a good way to backup data without using a super-user, and to store +@@ -1030,16 +1031,16 @@ This is a good way to backup data without using a super-user, and to store ACLs from incompatible systems. The bf(--fake-super) option only affects the side where the option is used. @@ -166,7 +149,7 @@ diff --git a/rsync.yo b/rsync.yo This option is overridden by both bf(--super) and bf(--no-super). -@@ -1281,6 +1282,36 @@ machine for use with the bf(--relative) option. For instance: +@@ -1292,6 +1293,36 @@ machine for use with the bf(--relative) option. For instance: quote(tt( rsync -avR --rsync-path="cd /a/b && rsync" host:c/d /e/)) @@ -203,7 +186,7 @@ diff --git a/rsync.yo b/rsync.yo dit(bf(-C, --cvs-exclude)) This is a useful shorthand for excluding a broad range of files that you often don't want to transfer between systems. It uses a similar algorithm to CVS to determine if -@@ -1752,7 +1783,7 @@ option if you wish to override this. +@@ -1768,7 +1799,7 @@ option if you wish to override this. Here's a example command that requests the remote side to log what is happening: