diff options
author | Rob Landley <rob@landley.net> | 2019-10-24 19:41:09 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-10-24 19:41:09 -0500 |
commit | 1f5f147a9ec048897c43e2358223430098493497 (patch) | |
tree | a8bebfb7fe4dd008d7420a9d609eb304d26c4eed /toys | |
parent | 69efea9cc568b3906340ddf45df66db811d4f204 (diff) | |
download | toybox-1f5f147a9ec048897c43e2358223430098493497.tar.gz |
Fix the xargs argument too long problem by putting the proper accounting
back when they haven't specified -s, add tests.
Diffstat (limited to 'toys')
-rw-r--r-- | toys/posix/xargs.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/toys/posix/xargs.c b/toys/posix/xargs.c index a8ecd4d6..725eb593 100644 --- a/toys/posix/xargs.c +++ b/toys/posix/xargs.c @@ -64,11 +64,10 @@ static char *handle_entries(char *data, char **entry) if (!*s) break; save = ss = s; - // We ought to add sizeof(char *) to TT.bytes to be correct, but we don't - // for bug compatibility with busybox 1.30.1 and findutils 4.7.0. - + // Specifying -s can cause "argument too long" errors. + if (!FLAG(s)) TT.bytes += sizeof(void *)+1; for (;;) { - if (++TT.bytes >= TT.s && TT.s) return save; + if (++TT.bytes >= TT.s) return save; if (!*s || isspace(*s)) break; s++; } @@ -102,8 +101,7 @@ void xargs_main(void) // that the invoked utility has room to modify its environment variables // and command line arguments and still be able to invoke another utility", // though obviously that's not really something you can guarantee. - bytes = sysconf(_SC_ARG_MAX) - environ_bytes() - 2048; - if (!TT.s || TT.s > bytes) TT.s = bytes; + if (!FLAG(s)) TT.s = sysconf(_SC_ARG_MAX) - environ_bytes() - 2048; TT.delim = '\n'*!FLAG(0); @@ -116,7 +114,7 @@ void xargs_main(void) // count entries for (entries = 0, bytes = -1; entries < toys.optc; entries++, bytes++) - bytes += strlen(toys.optargs[entries]); + bytes += strlen(toys.optargs[entries]) + sizeof(char *)*!FLAG(s); if (bytes >= TT.s) error_exit("argument too long"); // Loop through exec chunks. |