X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/887e553f0503e45e5273b5c1d7fa71d5554bc542..e1f67417d7af01cc51dc4391d2bc7228ca42f73a:/main.c diff --git a/main.c b/main.c index fbc5030b..75070e3c 100644 --- a/main.c +++ b/main.c @@ -235,8 +235,9 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path, goto oom; for (tok = strtok(cmd, " "); tok; tok = strtok(NULL, " ")) { - if (argc >= MAX_ARGS) { - rprintf(FERROR, "Command is too long\n"); + /* Comparison leaves rooms for server_options(). */ + if (argc >= MAX_ARGS - 100) { + rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); exit_cleanup(RERR_SYNTAX); } args[argc++] = tok; @@ -277,6 +278,11 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path, } server_options(args,&argc); + + if (argc >= MAX_ARGS - 2) { + rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); + exit_cleanup(RERR_SYNTAX); + } } args[argc++] = "."; @@ -284,16 +290,11 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char *path, if (!daemon_over_rsh && path && *path) args[argc++] = path; - if (argc >= (int)(sizeof args / sizeof args[0])) { - rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n"); - exit_cleanup(RERR_MALLOC); /* XXX Need better RERR? */ - } - args[argc] = NULL; if (verbose > 3) { rprintf(FINFO,"cmd="); - for (i=0;i