From: Ron Yorston Date: Mon, 25 Feb 2019 08:29:38 +0000 (+0000) Subject: ash: eval: avoid leaking memory associated with redirections. Closes 7748 X-Git-Tag: 1_31_0~170 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f55161ad27b641f6e09c6c498fa8a2bdb1112b0a;p=oweals%2Fbusybox.git ash: eval: avoid leaking memory associated with redirections. Closes 7748 The following constructs result in ever-increasing memory usage: while true; do { true; } Signed-off-by: Denys Vlasenko --- diff --git a/shell/ash.c b/shell/ash.c index a284b084d..a4394d756 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -9034,8 +9034,11 @@ evaltree(union node *n, int flags) { int checkexit = 0; int (*evalfn)(union node *, int); + struct stackmark smark; int status = 0; + setstackmark(&smark); + if (n == NULL) { TRACE(("evaltree(NULL) called\n")); goto out; @@ -9149,6 +9152,7 @@ evaltree(union node *n, int flags) if (flags & EV_EXIT) raise_exception(EXEXIT); + popstackmark(&smark); TRACE(("leaving evaltree (no interrupts)\n")); return exitstatus; } @@ -9209,14 +9213,12 @@ evalfor(union node *n, int flags) struct arglist arglist; union node *argp; struct strlist *sp; - struct stackmark smark; int status = 0; errlinno = lineno = n->ncase.linno; if (funcline) lineno -= funcline - 1; - setstackmark(&smark); arglist.list = NULL; arglist.lastp = &arglist.list; for (argp = n->nfor.args; argp; argp = argp->narg.next) { @@ -9233,7 +9235,6 @@ evalfor(union node *n, int flags) break; } loopnest--; - popstackmark(&smark); return status; } @@ -9244,14 +9245,12 @@ evalcase(union node *n, int flags) union node *cp; union node *patp; struct arglist arglist; - struct stackmark smark; int status = 0; errlinno = lineno = n->ncase.linno; if (funcline) lineno -= funcline - 1; - setstackmark(&smark); arglist.list = NULL; arglist.lastp = &arglist.list; expandarg(n->ncase.expr, &arglist, EXP_TILDE); @@ -9270,8 +9269,6 @@ evalcase(union node *n, int flags) } } out: - popstackmark(&smark); - return status; } @@ -9970,7 +9967,6 @@ evalcommand(union node *cmd, int flags) struct localvar_list *localvar_stop; struct parsefile *file_stop; struct redirtab *redir_stop; - struct stackmark smark; union node *argp; struct arglist arglist; struct arglist varlist; @@ -9992,7 +9988,6 @@ evalcommand(union node *cmd, int flags) /* First expand the arguments. */ TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); - setstackmark(&smark); localvar_stop = pushlocalvars(); file_stop = g_parsefile; back_exitstatus = 0; @@ -10275,7 +10270,6 @@ evalcommand(union node *cmd, int flags) */ setvar0("_", lastarg); } - popstackmark(&smark); return status; }