From: Michael Neuling <mikey@neuling.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Americo Wang <xiyou.wangcong@gmail.com>,
Anton Blanchard <anton@samba.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Oleg Nesterov <oleg@redhat.com>, James Morris <jmorris@namei.org>,
Ingo Molnar <mingo@elte.hu>,
linux-fsdevel@vger.kernel.org, stable@kernel.org,
linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org,
Serge Hallyn <serue@us.ibm.com>,
Paul Mackerras <paulus@samba.org>,
benh@kernel.crashing.org, miltonm@bga.com, aeb@cwi.nl,
linux-parisc@vger.kernel.org
Subject: Re: [PATCH] Restrict initial stack space expansion to rlimit
Date: Wed, 10 Feb 2010 08:51:29 +1100 [thread overview]
Message-ID: <10733.1265752289@neuling.org> (raw)
In-Reply-To: <20100209132529.bfc455b7.akpm@linux-foundation.org>
> > > note: it's untested.
> >
> > Works for me on ppc64 with 4k and 64k pages. Thanks!
> >
> > I'd still like someone with a CONFIG_STACK_GROWSUP arch to test/ACK it
> > as well.
>
> There's only one CONFIG_GROWSUP arch - parisc.
>
> Guys, here's the rolled-up patch.
FYI the rolled up patch still works fine on PPC64. Thanks.
> Could someone please test it on parisc?
>
> err, I'm not sure what one needs to do to test it, actually.
> Presumably it involves setting an unusual `ulimit -s'. Can someone
> please suggest a test plan?
How about doing:
'ulimit -s 15; ls'
before and after the patch is applied. Before it's applied, 'ls' should
be killed. After the patch is applied, 'ls' should no longer be killed.
I'm suggesting a stack limit of 15KB since it's small enough to trigger
20*PAGE_SIZE. Also 15KB not a multiple of PAGE_SIZE, which is a trickier
case to handle correctly with this code.
4K pages on parisc should be fine to test with.
Mikey
>
> From: Michael Neuling <mikey@neuling.org>
>
> When reserving stack space for a new process, make sure we're not
> attempting to expand the stack by more than rlimit allows.
>
> This fixes a bug caused by b6a2fea39318e43fee84fa7b0b90d68bed92d2ba ("mm:
> variable length argument support") and unmasked by
> fc63cf237078c86214abcb2ee9926d8ad289da9b ("exec: setup_arg_pages() fails
> to return errors").
>
> This bug means that when limiting the stack to less the 20*PAGE_SIZE (eg.
> 80K on 4K pages or 'ulimit -s 79') all processes will be killed before
> they start. This is particularly bad with 64K pages, where a ulimit below
> 1280K will kill every process.
>
> Signed-off-by: Michael Neuling <mikey@neuling.org>
> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Cc: Americo Wang <xiyou.wangcong@gmail.com>
> Cc: Anton Blanchard <anton@samba.org>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: James Morris <jmorris@namei.org>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Serge Hallyn <serue@us.ibm.com>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: <stable@kernel.org>
>
> fs/exec.c | 21 +++++++++++++++++++--
> 1 file changed, 19 insertions(+), 2 deletions(-)
>
> diff -puN fs/exec.c~fs-execc-restrict-initial-stack-space-expansion-to-rlimit
fs/exec.c
> --- a/fs/exec.c~fs-execc-restrict-initial-stack-space-expansion-to-rlimit
> +++ a/fs/exec.c
> @@ -571,6 +571,9 @@ int setup_arg_pages(struct linux_binprm
> struct vm_area_struct *prev = NULL;
> unsigned long vm_flags;
> unsigned long stack_base;
> + unsigned long stack_size;
> + unsigned long stack_expand;
> + unsigned long rlim_stack;
>
> #ifdef CONFIG_STACK_GROWSUP
> /* Limit stack size to 1GB */
> @@ -627,10 +630,24 @@ int setup_arg_pages(struct linux_binprm
> goto out_unlock;
> }
>
> + stack_expand = EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + stack_size = vma->vm_end - vma->vm_start;
> + /*
> + * Align this down to a page boundary as expand_stack
> + * will align it up.
> + */
> + rlim_stack = rlimit(RLIMIT_STACK) & PAGE_MASK;
> + rlim_stack = min(rlim_stack, stack_size);
> #ifdef CONFIG_STACK_GROWSUP
> - stack_base = vma->vm_end + EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + if (stack_size + stack_expand > rlim_stack)
> + stack_base = vma->vm_start + rlim_stack;
> + else
> + stack_base = vma->vm_end + stack_expand;
> #else
> - stack_base = vma->vm_start - EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + if (stack_size + stack_expand > rlim_stack)
> + stack_base = vma->vm_end - rlim_stack;
> + else
> + stack_base = vma->vm_start - stack_expand;
> #endif
> ret = expand_stack(vma, stack_base);
> if (ret)
> _
>
WARNING: multiple messages have this Message-ID (diff)
From: Michael Neuling <mikey@neuling.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-parisc@vger.kernel.org, linux-kernel@vger.kernel.org,
aeb@cwi.nl, Oleg Nesterov <oleg@redhat.com>,
miltonm@bga.com, James Morris <jmorris@namei.org>,
linuxppc-dev@ozlabs.org, Paul Mackerras <paulus@samba.org>,
Anton Blanchard <anton@samba.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Serge Hallyn <serue@us.ibm.com>,
linux-fsdevel@vger.kernel.org,
Americo Wang <xiyou.wangcong@gmail.com>,
Ingo Molnar <mingo@elte.hu>,
Linus Torvalds <torvalds@linux-foundation.org>,
stable@kernel.org, Alexander Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH] Restrict initial stack space expansion to rlimit
Date: Wed, 10 Feb 2010 08:51:29 +1100 [thread overview]
Message-ID: <10733.1265752289@neuling.org> (raw)
In-Reply-To: <20100209132529.bfc455b7.akpm@linux-foundation.org>
> > > note: it's untested.
> >
> > Works for me on ppc64 with 4k and 64k pages. Thanks!
> >
> > I'd still like someone with a CONFIG_STACK_GROWSUP arch to test/ACK it
> > as well.
>
> There's only one CONFIG_GROWSUP arch - parisc.
>
> Guys, here's the rolled-up patch.
FYI the rolled up patch still works fine on PPC64. Thanks.
> Could someone please test it on parisc?
>
> err, I'm not sure what one needs to do to test it, actually.
> Presumably it involves setting an unusual `ulimit -s'. Can someone
> please suggest a test plan?
How about doing:
'ulimit -s 15; ls'
before and after the patch is applied. Before it's applied, 'ls' should
be killed. After the patch is applied, 'ls' should no longer be killed.
I'm suggesting a stack limit of 15KB since it's small enough to trigger
20*PAGE_SIZE. Also 15KB not a multiple of PAGE_SIZE, which is a trickier
case to handle correctly with this code.
4K pages on parisc should be fine to test with.
Mikey
>
> From: Michael Neuling <mikey@neuling.org>
>
> When reserving stack space for a new process, make sure we're not
> attempting to expand the stack by more than rlimit allows.
>
> This fixes a bug caused by b6a2fea39318e43fee84fa7b0b90d68bed92d2ba ("mm:
> variable length argument support") and unmasked by
> fc63cf237078c86214abcb2ee9926d8ad289da9b ("exec: setup_arg_pages() fails
> to return errors").
>
> This bug means that when limiting the stack to less the 20*PAGE_SIZE (eg.
> 80K on 4K pages or 'ulimit -s 79') all processes will be killed before
> they start. This is particularly bad with 64K pages, where a ulimit below
> 1280K will kill every process.
>
> Signed-off-by: Michael Neuling <mikey@neuling.org>
> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Cc: Americo Wang <xiyou.wangcong@gmail.com>
> Cc: Anton Blanchard <anton@samba.org>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: James Morris <jmorris@namei.org>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Serge Hallyn <serue@us.ibm.com>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: <stable@kernel.org>
>
> fs/exec.c | 21 +++++++++++++++++++--
> 1 file changed, 19 insertions(+), 2 deletions(-)
>
> diff -puN fs/exec.c~fs-execc-restrict-initial-stack-space-expansion-to-rlimit
fs/exec.c
> --- a/fs/exec.c~fs-execc-restrict-initial-stack-space-expansion-to-rlimit
> +++ a/fs/exec.c
> @@ -571,6 +571,9 @@ int setup_arg_pages(struct linux_binprm
> struct vm_area_struct *prev = NULL;
> unsigned long vm_flags;
> unsigned long stack_base;
> + unsigned long stack_size;
> + unsigned long stack_expand;
> + unsigned long rlim_stack;
>
> #ifdef CONFIG_STACK_GROWSUP
> /* Limit stack size to 1GB */
> @@ -627,10 +630,24 @@ int setup_arg_pages(struct linux_binprm
> goto out_unlock;
> }
>
> + stack_expand = EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + stack_size = vma->vm_end - vma->vm_start;
> + /*
> + * Align this down to a page boundary as expand_stack
> + * will align it up.
> + */
> + rlim_stack = rlimit(RLIMIT_STACK) & PAGE_MASK;
> + rlim_stack = min(rlim_stack, stack_size);
> #ifdef CONFIG_STACK_GROWSUP
> - stack_base = vma->vm_end + EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + if (stack_size + stack_expand > rlim_stack)
> + stack_base = vma->vm_start + rlim_stack;
> + else
> + stack_base = vma->vm_end + stack_expand;
> #else
> - stack_base = vma->vm_start - EXTRA_STACK_VM_PAGES * PAGE_SIZE;
> + if (stack_size + stack_expand > rlim_stack)
> + stack_base = vma->vm_end - rlim_stack;
> + else
> + stack_base = vma->vm_start - stack_expand;
> #endif
> ret = expand_stack(vma, stack_base);
> if (ret)
> _
>
next prev parent reply other threads:[~2010-02-09 21:51 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-06 0:43 Stack size protection broken on ppc64 Michael Neuling
2010-02-06 4:20 ` Anton Blanchard
2010-02-06 4:20 ` Anton Blanchard
2010-02-06 10:22 ` Michael Neuling
2010-02-06 10:22 ` Michael Neuling
2010-02-08 0:04 ` Anton Blanchard
2010-02-08 0:04 ` Anton Blanchard
2010-02-08 0:07 ` [PATCH] Restrict stack space reservation to rlimit Michael Neuling
2010-02-08 0:07 ` Michael Neuling
2010-02-08 0:28 ` Michael Neuling
2010-02-08 0:28 ` Michael Neuling
2010-02-08 5:06 ` KOSAKI Motohiro
2010-02-08 5:06 ` KOSAKI Motohiro
2010-02-08 5:11 ` Anton Blanchard
2010-02-08 5:11 ` Anton Blanchard
2010-02-08 5:22 ` KOSAKI Motohiro
2010-02-08 5:22 ` KOSAKI Motohiro
2010-02-08 5:31 ` Anton Blanchard
2010-02-08 5:31 ` Anton Blanchard
2010-02-08 6:11 ` KOSAKI Motohiro
2010-02-08 6:11 ` KOSAKI Motohiro
2010-02-08 5:37 ` Michael Neuling
2010-02-08 5:37 ` Michael Neuling
2010-02-08 6:05 ` KOSAKI Motohiro
2010-02-08 6:05 ` KOSAKI Motohiro
2010-02-08 7:07 ` Américo Wang
2010-02-08 7:07 ` Américo Wang
2010-02-08 7:07 ` Américo Wang
2010-02-08 7:11 ` KOSAKI Motohiro
2010-02-08 7:11 ` KOSAKI Motohiro
2010-02-09 6:11 ` [PATCH] Restrict initial stack space expansion " Michael Neuling
2010-02-09 6:11 ` Michael Neuling
2010-02-09 6:46 ` KOSAKI Motohiro
2010-02-09 6:46 ` KOSAKI Motohiro
2010-02-09 8:59 ` Michael Neuling
2010-02-09 8:59 ` Michael Neuling
2010-02-09 21:25 ` Andrew Morton
2010-02-09 21:25 ` Andrew Morton
2010-02-09 21:51 ` Michael Neuling [this message]
2010-02-09 21:51 ` Michael Neuling
2010-02-09 22:27 ` Helge Deller
2010-02-09 22:27 ` Helge Deller
2010-02-10 5:12 ` KOSAKI Motohiro
2010-02-10 5:12 ` KOSAKI Motohiro
2010-02-10 5:30 ` Michael Neuling
2010-02-10 5:30 ` Michael Neuling
2010-02-10 5:31 ` Michael Neuling
2010-02-10 5:31 ` Michael Neuling
2010-02-11 22:16 ` Helge Deller
2010-02-11 22:16 ` Helge Deller
2010-02-11 22:22 ` Michael Neuling
2010-02-11 22:22 ` Michael Neuling
2010-02-12 5:44 ` [PATCH] Create initial stack independent of PAGE_SIZE Michael Neuling
2010-02-12 7:20 ` KOSAKI Motohiro
2010-02-12 9:02 ` Michael Neuling
2010-02-12 9:51 ` KOSAKI Motohiro
2010-02-08 10:45 ` [PATCH] Restrict stack space reservation to rlimit Michael Neuling
2010-02-08 10:45 ` Michael Neuling
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10733.1265752289@neuling.org \
--to=mikey@neuling.org \
--cc=aeb@cwi.nl \
--cc=akpm@linux-foundation.org \
--cc=anton@samba.org \
--cc=benh@kernel.crashing.org \
--cc=jmorris@namei.org \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-parisc@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=miltonm@bga.com \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=paulus@samba.org \
--cc=serue@us.ibm.com \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.