diff options
author | alc <alc@FreeBSD.org> | 2010-07-27 17:31:03 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-07-27 17:31:03 +0000 |
commit | 256c63de2893fe3b3b9d97763bc4871052984f8f (patch) | |
tree | a92c11fd0f16b4fd2595573c50330d0e933b83dc /sys/kern | |
parent | 3571b845b3692def492231ca1420482177b1d056 (diff) | |
download | FreeBSD-src-256c63de2893fe3b3b9d97763bc4871052984f8f.zip FreeBSD-src-256c63de2893fe3b3b9d97763bc4871052984f8f.tar.gz |
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
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/imgact_shell.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 36 |
2 files changed, 24 insertions, 15 deletions
diff --git a/sys/kern/imgact_shell.c b/sys/kern/imgact_shell.c index 5eb3065..d0ef87c 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 1f0944c..2242328 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; } } |