[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [Bug 7748] New: ash: fix a memory leak
From:       Yuki Machida <machida.yuki () jp ! fujitsu ! com>
Date:       2018-11-28 5:15:14
Message-ID: aa8baee1-b3aa-2d8d-0345-844c21760720 () jp ! fujitsu ! com
[Download RAW message or body]

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
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic