aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/xargs.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2019-10-24 19:41:09 -0500
committerRob Landley <rob@landley.net>2019-10-24 19:41:09 -0500
commit1f5f147a9ec048897c43e2358223430098493497 (patch)
treea8bebfb7fe4dd008d7420a9d609eb304d26c4eed /toys/posix/xargs.c
parent69efea9cc568b3906340ddf45df66db811d4f204 (diff)
downloadtoybox-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/posix/xargs.c')
-rw-r--r--toys/posix/xargs.c12
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.