aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/find.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix/find.c')
-rw-r--r--toys/posix/find.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 5c72131d..762f89fc 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -61,6 +61,7 @@ GLOBALS(
struct double_list *argdata;
int topdir, xdev, depth;
time_t now;
+ long max_bytes;
)
struct execdir_data {
@@ -498,10 +499,10 @@ static int do_find(struct dirtree *new)
// Done here vs argument parsing pass so it's after dlist_terminate
aa->prev = (void *)1;
- // Flush if we pass 16 megs of environment space.
+ // Flush if the child's environment space gets too large.
// An insanely long path (>2 gigs) could wrap the counter and
// defeat this test, which could potentially trigger OOM killer.
- if ((aa->plus += sizeof(char *)+strlen(name)+1) > 1<<24) {
+ if ((aa->plus += sizeof(char *)+strlen(name)+1) > TT.max_bytes) {
aa->plus = 1;
toys.exitval |= flush_exec(new, aa);
}
@@ -543,6 +544,7 @@ void find_main(void)
char **ss = toys.optargs;
TT.topdir = -1;
+ TT.max_bytes = sysconf(_SC_ARG_MAX) - environ_bytes();
// Distinguish paths from filters
for (len = 0; toys.optargs[len]; len++)