From 2af6e14d39f2e502889671dfaf10a11b663699b8 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 27 Jul 2010 17:31:03 +0000 Subject: [PATCH] Introduce exec_alloc_args(). The objective being to encapsulate the details of the string buffer allocation in one place. Eliminate the portion of the string buffer that was dedicated to storing the interpreter name. The pointer to the interpreter name can simply be made to point to the appropriate argument string. Reviewed by: kib --- sys/compat/freebsd32/freebsd32_misc.c | 16 ++++++------ sys/kern/imgact_shell.c | 3 +-- sys/kern/kern_exec.c | 36 +++++++++++++++++---------- sys/sys/imgact.h | 1 + sys/vm/vm_init.c | 4 +-- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 1144f8027bcc..3dfed77d478b 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -86,7 +86,6 @@ __FBSDID("$FreeBSD$"); #endif #include -#include #include #include #include @@ -279,19 +278,18 @@ freebsd32_exec_copyin_args(struct image_args *args, char *fname, return (EFAULT); /* - * Allocate temporary demand zeroed space for argument and - * environment strings + * Allocate demand-paged memory for the file name, argument, and + * environment strings. */ - args->buf = (char *) kmem_alloc_wait(exec_map, - PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); - if (args->buf == NULL) - return (ENOMEM); + error = exec_alloc_args(args); + if (error != 0) + return (error); /* * Copy the file name. */ if (fname != NULL) { - args->fname = args->buf + MAXSHELLCMDLEN; + args->fname = args->buf; error = (segflg == UIO_SYSSPACE) ? copystr(fname, args->fname, PATH_MAX, &length) : copyinstr(fname, args->fname, PATH_MAX, &length); @@ -300,7 +298,7 @@ freebsd32_exec_copyin_args(struct image_args *args, char *fname, } else length = 0; - args->begin_argv = args->buf + MAXSHELLCMDLEN + length; + args->begin_argv = args->buf + length; args->endp = args->begin_argv; args->stringspace = ARG_MAX; diff --git a/sys/kern/imgact_shell.c b/sys/kern/imgact_shell.c index 5eb30653be76..d0ef87c1e231 100644 --- a/sys/kern/imgact_shell.c +++ b/sys/kern/imgact_shell.c @@ -240,8 +240,7 @@ exec_shell_imgact(imgp) imgp->args->stringspace, NULL); if (error == 0) - error = copystr(imgp->args->begin_argv, imgp->interpreter_name, - MAXSHELLCMDLEN, NULL); + imgp->interpreter_name = imgp->args->begin_argv; if (sname != NULL) sbuf_delete(sname); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 1f0944c96f75..2242328d9ead 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -375,7 +375,7 @@ do_execve(td, args, mac_p) imgp->vmspace_destroyed = 0; imgp->interpreted = 0; imgp->opened = 0; - imgp->interpreter_name = args->buf; + imgp->interpreter_name = NULL; imgp->auxargs = NULL; imgp->vp = NULL; imgp->object = NULL; @@ -1078,23 +1078,20 @@ exec_copyin_args(struct image_args *args, char *fname, bzero(args, sizeof(*args)); if (argv == NULL) return (EFAULT); + /* - * Allocate temporary demand zeroed space for argument and - * environment strings: - * - * o ARG_MAX for argument and environment; - * o MAXSHELLCMDLEN for the name of interpreters. + * Allocate demand-paged memory for the file name, argument, and + * environment strings. */ - args->buf = (char *) kmem_alloc_wait(exec_map, - PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); - if (args->buf == NULL) - return (ENOMEM); + error = exec_alloc_args(args); + if (error != 0) + return (error); /* * Copy the file name. */ if (fname != NULL) { - args->fname = args->buf + MAXSHELLCMDLEN; + args->fname = args->buf; error = (segflg == UIO_SYSSPACE) ? copystr(fname, args->fname, PATH_MAX, &length) : copyinstr(fname, args->fname, PATH_MAX, &length); @@ -1103,7 +1100,7 @@ exec_copyin_args(struct image_args *args, char *fname, } else length = 0; - args->begin_argv = args->buf + MAXSHELLCMDLEN + length; + args->begin_argv = args->buf + length; args->endp = args->begin_argv; args->stringspace = ARG_MAX; @@ -1156,13 +1153,26 @@ err_exit: return (error); } +/* + * Allocate temporary demand-paged, zero-filled memory for the file name, + * argument, and environment strings. Returns zero if the allocation succeeds + * and ENOMEM otherwise. + */ +int +exec_alloc_args(struct image_args *args) +{ + + args->buf = (char *)kmem_alloc_wait(exec_map, PATH_MAX + ARG_MAX); + return (args->buf != NULL ? 0 : ENOMEM); +} + void exec_free_args(struct image_args *args) { if (args->buf != NULL) { kmem_free_wakeup(exec_map, (vm_offset_t)args->buf, - PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); + PATH_MAX + ARG_MAX); args->buf = NULL; } } diff --git a/sys/sys/imgact.h b/sys/sys/imgact.h index d20c491a2b05..c4075faafb01 100644 --- a/sys/sys/imgact.h +++ b/sys/sys/imgact.h @@ -78,6 +78,7 @@ struct thread; #define IMGACT_CORE_COMPRESS 0x01 +int exec_alloc_args(struct image_args *); int exec_check_permissions(struct image_params *); register_t *exec_copyout_strings(struct image_params *); void exec_free_args(struct image_args *); diff --git a/sys/vm/vm_init.c b/sys/vm/vm_init.c index 877593714948..c5076919eef7 100644 --- a/sys/vm/vm_init.c +++ b/sys/vm/vm_init.c @@ -73,7 +73,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -195,8 +194,7 @@ again: (long)nswbuf * MAXPHYS, FALSE); pager_map->system_map = 1; exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, - exec_map_entries * round_page(PATH_MAX + ARG_MAX + MAXSHELLCMDLEN), - FALSE); + exec_map_entries * round_page(PATH_MAX + ARG_MAX), FALSE); pipe_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, maxpipekva, FALSE);