[PATCH] eval: avoid leaking memory associated with redirections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux