Commit d71f290b4e98a39f49f2595a13be3b4d5ce8e1f1
1 parent
2425ce8402
Exists in
ti-lsk-linux-4.1.y
and in
12 other branches
metag: Reduce maximum stack size to 256MB
Specify the maximum stack size for arches where the stack grows upward (parisc and metag) in asm/processor.h rather than hard coding in fs/exec.c so that metag can specify a smaller value of 256MB rather than 1GB. This fixes a BUG on metag if the RLIMIT_STACK hard limit is increased beyond a safe value by root. E.g. when starting a process after running "ulimit -H -s unlimited" it will then attempt to use a stack size of the maximum 1GB which is far too big for metag's limited user virtual address space (stack_top is usually 0x3ffff000): BUG: failure at fs/exec.c:589/shift_arg_pages()! Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Helge Deller <deller@gmx.de> Cc: "James E.J. Bottomley" <jejb@parisc-linux.org> Cc: linux-parisc@vger.kernel.org Cc: linux-metag@vger.kernel.org Cc: John David Anglin <dave.anglin@bell.net> Cc: stable@vger.kernel.org # only needed for >= v3.9 (arch/metag)
Showing 3 changed files with 7 additions and 3 deletions Side-by-side Diff
arch/metag/include/asm/processor.h
... | ... | @@ -22,6 +22,8 @@ |
22 | 22 | /* Add an extra page of padding at the top of the stack for the guard page. */ |
23 | 23 | #define STACK_TOP (TASK_SIZE - PAGE_SIZE) |
24 | 24 | #define STACK_TOP_MAX STACK_TOP |
25 | +/* Maximum virtual space for stack */ | |
26 | +#define STACK_SIZE_MAX (1 << 28) /* 256 MB */ | |
25 | 27 | |
26 | 28 | /* This decides where the kernel will search for a free chunk of vm |
27 | 29 | * space during mmap's. |
arch/parisc/include/asm/processor.h
fs/exec.c
... | ... | @@ -657,10 +657,10 @@ |
657 | 657 | unsigned long rlim_stack; |
658 | 658 | |
659 | 659 | #ifdef CONFIG_STACK_GROWSUP |
660 | - /* Limit stack size to 1GB */ | |
660 | + /* Limit stack size */ | |
661 | 661 | stack_base = rlimit_max(RLIMIT_STACK); |
662 | - if (stack_base > (1 << 30)) | |
663 | - stack_base = 1 << 30; | |
662 | + if (stack_base > STACK_SIZE_MAX) | |
663 | + stack_base = STACK_SIZE_MAX; | |
664 | 664 | |
665 | 665 | /* Make sure we didn't let the argument array grow too large. */ |
666 | 666 | if (vma->vm_end - vma->vm_start > stack_base) |