Hi!
> From: Peter Zijlstra <[email protected]>
>
> Some folks find 128KB of env+arg space too little. Solaris provides them with
> 1MB. Manually changing MAX_ARG_PAGES worked for them so far, however they
> would like to run the supported vendor kernel.
>
> In the interrest of not penalizing everybody with the overhead of just
> setting it larger, provide a sysctl to change it.
I very muh like that idea.
> Compiles and boots on i386.
>
> Signed-off-by: Peter Zijlstra <[email protected]>
...but does is also work if you keep changing that value in the tight
loop while trying to work with the system?
> Index: linux-2.6/fs/binfmt_elf.c
> ===================================================================
> --- linux-2.6.orig/fs/binfmt_elf.c 2006-06-14 15:56:40.000000000 +0200
> +++ linux-2.6/fs/binfmt_elf.c 2006-06-14 16:00:36.000000000 +0200
> @@ -255,8 +255,9 @@ create_elf_tables(struct linux_binprm *b
> while (argc-- > 0) {
> size_t len;
> __put_user((elf_addr_t)p, argv++);
> - len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES);
> - if (!len || len > PAGE_SIZE*MAX_ARG_PAGES)
> + len = strnlen_user((void __user *)p,
> + PAGE_SIZE*bprm->max_arg_pages);
> + if (!len || len > PAGE_SIZE*bprm->max_arg_pages)
> return 0;
> p += len;
> }
> @@ -266,8 +267,9 @@ create_elf_tables(struct linux_binprm *b
> while (envc-- > 0) {
> size_t len;
> __put_user((elf_addr_t)p, envp++);
> - len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES);
> - if (!len || len > PAGE_SIZE*MAX_ARG_PAGES)
> + len = strnlen_user((void __user *)p,
> + PAGE_SIZE*bprm->max_arg_pages);
> + if (!len || len > PAGE_SIZE*bprm->max_arg_pages)
> return 0;
> p += len;
> }
> Index: linux-2.6/fs/binfmt_elf_fdpic.c
> ===================================================================
> --- linux-2.6.orig/fs/binfmt_elf_fdpic.c 2006-06-14 15:56:40.000000000 +0200
> +++ linux-2.6/fs/binfmt_elf_fdpic.c 2006-06-14 16:00:36.000000000 +0200
> @@ -578,14 +578,15 @@ static int create_elf_fdpic_tables(struc
> #ifdef CONFIG_MMU
> current->mm->arg_start = bprm->p;
> #else
> - current->mm->arg_start = current->mm->start_stack - (MAX_ARG_PAGES * PAGE_SIZE - bprm->p);
> + current->mm->arg_start = current->mm->start_stack -
> + (bprm->max_arg_pages * PAGE_SIZE - bprm->p);
> #endif
>
> p = (char *) current->mm->arg_start;
> for (loop = bprm->argc; loop > 0; loop--) {
What happens if someone changes that sysctl from other cpu at this
point?
> __put_user((elf_caddr_t) p, argv++);
> - len = strnlen_user(p, PAGE_SIZE * MAX_ARG_PAGES);
> - if (!len || len > PAGE_SIZE * MAX_ARG_PAGES)
> + len = strnlen_user(p, PAGE_SIZE * bprm->max_arg_pages);
> + if (!len || len > PAGE_SIZE * bprm->max_arg_pages)
> return -EINVAL;
> p += len;
> }
--
Thanks for all the (sleeping) penguins.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]