Re: [RFC/PATCH] RLIMIT_ARG_MAX

From: Carlos O'Donell
Date: Sat Mar 01 2008 - 09:28:03 EST


Linus Torvalds wrote:
On Fri, 29 Feb 2008, Linus Torvalds wrote:
I do agree that we should at least make the "MAX(stacksize/4, 128k)" change for backwards compatibility.

How about something like this?

This is perfect. As the original submitter of the bug my primary interest is in having the regression fixed.

The alternative is to just remove that size check entirely, and depend on get_user_pages() doing the stack limit check (among all the *other* checks it does when it does the acct_stack_growth() thing).

I'd almost prefer that simpler approach, but I don't have any really strong preferences. Anybody?

Linus

---
fs/exec.c | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/fs/exec.c b/fs/exec.c
index a44b142..e91f9cb 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -173,8 +173,15 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
return NULL;
if (write) {
- struct rlimit *rlim = current->signal->rlim;
unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start;
+ struct rlimit *rlim;
+
+ /*
+ * We've historically supported up to 32 pages of argument
+ * strings even with small stacks
+ */
+ if (size <= 32*PAGE_SIZE)
+ return page;

Could you use ARG_MAX as defined in include/linux/limits.h?

/*
* Limit to 1/4-th the stack size for the argv+env strings.
@@ -183,6 +190,7 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
* - the program will have a reasonable amount of stack left
* to work from.
*/
+ rlim = current->signal->rlim;
if (size > rlim[RLIMIT_STACK].rlim_cur / 4) {
put_page(page);
return NULL;

Cheers,
Carlos.
--
Carlos O'Donell
CodeSourcery
carlos@xxxxxxxxxxxxxxxx
(650) 331-3385 x716
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/