Hi Ron,

I confirmed that it disappeard a memory leak after apply this patch.

Best regards,
Yuki

On 2018/11/22 21:34, Ron Yorston wrote:
There's another case where a leak is possible:  when the redirection
is associated with a subshell inside the long-running loop:

    while true; do ( true; ) </dev/null; done

This case appears to be fixed by the extended patch below.

The same problems are also present in dash and can be fixed by a similar
patch.  Bash is unaffected.

I'm still not sure if these patches are safe.

Ron

---
  shell/ash.c | 6 ++++++
  1 file changed, 6 insertions(+)

diff --git a/shell/ash.c b/shell/ash.c
index 04e4006c8..329ddae67 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -9049,6 +9049,7 @@ evaltree(union node *n, int flags)
        int checkexit = 0;
        int (*evalfn)(union node *, int);
        int status = 0;
+       struct stackmark smark;
if (n == NULL) {
                TRACE(("evaltree(NULL) called\n"));
@@ -9069,6 +9070,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;
@@ -9080,6 +9082,7 @@ evaltree(union node *n, int flags)
                }
                if (n->nredir.redirect)
                        popredir(/*drop:*/ 0);
+               popstackmark(&smark);
                goto setstatus;
        case NCMD:
                evalfn = evalcommand;
@@ -9298,7 +9301,9 @@ evalsubshell(union node *n, int flags)
        struct job *jp;
        int backgnd = (n->type == NBACKGND); /* FORK_BG(1) if yes, else 
FORK_FG(0) */
        int status;
+       struct stackmark smark;
+ setstackmark(&smark);
        errlinno = lineno = n->nredir.linno;
        if (funcline)
                lineno -= funcline - 1;
@@ -9326,6 +9331,7 @@ evalsubshell(union node *n, int flags)
        if (backgnd == FORK_FG)
                status = waitforjob(jp);
        INT_ON;
+       popstackmark(&smark);
        return status;
  }
--
Yuki Machida

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to