The following constructs result in ever-increasing memory usage: while true; do { true; } </dev/null; done while true; do ( true; ) </dev/null; done For comparison, bash displays static memory usage in both cases. This issue was reported for BusyBox ash which is derived from dash: https://bugs.busybox.net/show_bug.cgi?id=7748 Signed-off-by: Ron Yorston <rmy@xxxxxxxxxxxx> --- src/eval.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/eval.c b/src/eval.c index 546ee1b..9f117ea 100644 --- a/src/eval.c +++ b/src/eval.c @@ -202,6 +202,7 @@ evaltree(union node *n, int flags) int (*evalfn)(union node *, int); unsigned isor; int status = 0; + struct stackmark smark; if (n == NULL) { TRACE(("evaltree(NULL) called\n")); goto out; @@ -227,6 +228,7 @@ evaltree(union node *n, int flags) status = !evaltree(n->nnot.com, EV_TESTED); goto setstatus; case NREDIR: + setstackmark(&smark); errlinno = lineno = n->nredir.linno; if (funcline) lineno -= funcline - 1; @@ -236,6 +238,7 @@ evaltree(union node *n, int flags) evaltree(n->nredir.n, flags & EV_TESTED); if (n->nredir.redirect) popredir(0); + popstackmark(&smark); goto setstatus; case NCMD: #ifdef notyet @@ -476,11 +479,13 @@ evalsubshell(union node *n, int flags) struct job *jp; int backgnd = (n->type == NBACKGND); int status; + struct stackmark smark; errlinno = lineno = n->nredir.linno; if (funcline) lineno -= funcline - 1; + setstackmark(&smark); expredir(n->nredir.redirect); if (!backgnd && flags & EV_EXIT && !have_traps()) goto nofork; @@ -500,6 +505,7 @@ nofork: if (! backgnd) status = waitforjob(jp); INTON; + popstackmark(&smark); return status; } -- 2.19.1