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
This commit is contained in:
Alan Cox 2010-07-27 17:31:03 +00:00
parent 629ce700d5
commit 2af6e14d39
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=210545
5 changed files with 33 additions and 27 deletions

View File

@ -86,7 +86,6 @@ __FBSDID("$FreeBSD$");
#endif
#include <vm/vm.h>
#include <vm/vm_kern.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
@ -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;

View File

@ -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);

View File

@ -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 @@ exec_copyin_args(struct image_args *args, char *fname,
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;
}
}

View File

@ -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 *);

View File

@ -73,7 +73,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/selinfo.h>
#include <sys/imgact.h>
#include <sys/pipe.h>
#include <sys/bio.h>
#include <sys/buf.h>
@ -195,8 +194,7 @@ vm_ksubmap_init(struct kva_md_info *kmi)
(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);