diff options
| -rw-r--r-- | arch/x86_64/ia32/ia32_aout.c | 5 | ||||
| -rw-r--r-- | arch/x86_64/ia32/ia32_binfmt.c | 7 | ||||
| -rw-r--r-- | fs/binfmt_aout.c | 2 | ||||
| -rw-r--r-- | fs/binfmt_elf.c | 2 | ||||
| -rw-r--r-- | fs/binfmt_som.c | 2 | ||||
| -rw-r--r-- | fs/exec.c | 12 | ||||
| -rw-r--r-- | include/linux/binfmts.h | 4 |
7 files changed, 20 insertions, 14 deletions
diff --git a/arch/x86_64/ia32/ia32_aout.c b/arch/x86_64/ia32/ia32_aout.c index 9d5991982495..6ac57fcf1340 100644 --- a/arch/x86_64/ia32/ia32_aout.c +++ b/arch/x86_64/ia32/ia32_aout.c @@ -36,7 +36,8 @@ #undef WARN_OLD #undef CORE_DUMP /* probably broken */ -extern int ia32_setup_arg_pages(struct linux_binprm *bprm, int exec_stack); +extern int ia32_setup_arg_pages(struct linux_binprm *bprm, + unsigned long stack_top, int exec_stack); static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs); static int load_aout_library(struct file*); @@ -397,7 +398,7 @@ beyond_if: set_brk(current->mm->start_brk, current->mm->brk); - retval = ia32_setup_arg_pages(bprm, EXSTACK_DEFAULT); + retval = ia32_setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); if (retval < 0) { /* Someone check-me: is this error path enough? */ send_sig(SIGKILL, current, 0); diff --git a/arch/x86_64/ia32/ia32_binfmt.c b/arch/x86_64/ia32/ia32_binfmt.c index 1abc95c54869..2b69d92253f1 100644 --- a/arch/x86_64/ia32/ia32_binfmt.c +++ b/arch/x86_64/ia32/ia32_binfmt.c @@ -273,8 +273,9 @@ do { \ #define load_elf_binary load_elf32_binary #define ELF_PLAT_INIT(r, load_addr) elf32_init(r) -#define setup_arg_pages(bprm, exec_stack) ia32_setup_arg_pages(bprm, exec_stack) -int ia32_setup_arg_pages(struct linux_binprm *bprm, int executable_stack); +#define setup_arg_pages(bprm, stack_top, exec_stack) \ + ia32_setup_arg_pages(bprm, stack_top, exec_stack) +int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top, int executable_stack); #undef start_thread #define start_thread(regs,new_rip,new_rsp) do { \ @@ -329,7 +330,7 @@ static void elf32_init(struct pt_regs *regs) me->thread.es = __USER_DS; } -int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) +int setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top, int executable_stack) { unsigned long stack_base; struct vm_area_struct *mpnt; diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 53ee183b379e..24194a43f32a 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -424,7 +424,7 @@ beyond_if: return retval; } - retval = setup_arg_pages(bprm, EXSTACK_DEFAULT); + retval = setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT); if (retval < 0) { /* Someone check-me: is this error path enough? */ send_sig(SIGKILL, current, 0); diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 26dd8daf02de..66846bc43856 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -736,7 +736,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) change some of these later */ current->mm->rss = 0; current->mm->free_area_cache = current->mm->mmap_base; - retval = setup_arg_pages(bprm, executable_stack); + retval = setup_arg_pages(bprm, STACK_TOP, executable_stack); if (retval < 0) { send_sig(SIGKILL, current, 0); goto out_free_dentry; diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index d7e5f1f23c2b..f02ee506dd65 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c @@ -254,7 +254,7 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) set_binfmt(&som_format); compute_creds(bprm); - setup_arg_pages(bprm, EXSTACK_DEFAULT); + setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT); create_som_tables(bprm); diff --git a/fs/exec.c b/fs/exec.c index 2426de1f868e..1aac6ab01325 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -343,7 +343,9 @@ out_sig: #define EXTRA_STACK_VM_PAGES 20 /* random */ -int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) +int setup_arg_pages(struct linux_binprm *bprm, + unsigned long stack_top, + int executable_stack) { unsigned long stack_base; struct vm_area_struct *mpnt; @@ -384,7 +386,7 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) stack_base = current->signal->rlim[RLIMIT_STACK].rlim_max; if (stack_base > (1 << 30)) stack_base = 1 << 30; - stack_base = PAGE_ALIGN(STACK_TOP - stack_base); + stack_base = PAGE_ALIGN(stack_top - stack_base); /* Adjust bprm->p to point to the end of the strings. */ bprm->p = stack_base + PAGE_SIZE * i - offset; @@ -396,10 +398,10 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) while (i < MAX_ARG_PAGES) bprm->page[i++] = NULL; #else - stack_base = STACK_TOP - MAX_ARG_PAGES * PAGE_SIZE; + stack_base = stack_top - MAX_ARG_PAGES * PAGE_SIZE; bprm->p += stack_base; mm->arg_start = bprm->p; - arg_size = STACK_TOP - (PAGE_MASK & (unsigned long) mm->arg_start); + arg_size = stack_top - (PAGE_MASK & (unsigned long) mm->arg_start); #endif arg_size += EXTRA_STACK_VM_PAGES * PAGE_SIZE; @@ -426,7 +428,7 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) mpnt->vm_start = stack_base; mpnt->vm_end = stack_base + arg_size; #else - mpnt->vm_end = STACK_TOP; + mpnt->vm_end = stack_top; mpnt->vm_start = mpnt->vm_end - arg_size; #endif /* Adjust stack execute permissions; explicitly enable diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index d3f220b57b4a..54f820832c73 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -74,7 +74,9 @@ extern int flush_old_exec(struct linux_binprm * bprm); #define EXSTACK_DISABLE_X 1 /* Disable executable stacks */ #define EXSTACK_ENABLE_X 2 /* Enable executable stacks */ -extern int setup_arg_pages(struct linux_binprm * bprm, int executable_stack); +extern int setup_arg_pages(struct linux_binprm * bprm, + unsigned long stack_top, + int executable_stack); extern int copy_strings(int argc,char __user * __user * argv,struct linux_binprm *bprm); extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); extern void compute_creds(struct linux_binprm *binprm); |
