Remove reference to struct execve_args from struct imgact, which

describes an image activation instance.  Instead, make use of the
existing fname structure entry, and introduce two new entries,
userspace_argv, and userspace_envv.  With the addition of
mac_execve(), this divorces the image structure from the specifics
of the execve() system call, removes a redundant pointer, etc.
No semantic change from current behavior, but it means that the
structure doesn't depend on syscalls.master-generated includes.

There seems to be some redundant initialization of imgact entries,
which I have maintained, but which could probably use some cleaning
up at some point.

Obtained from:	TrustedBSD Project
Sponsored by:	DARPA, Network Associates Laboratories
This commit is contained in:
Robert Watson 2002-11-05 01:59:56 +00:00
parent f8d0815040
commit 450ffb4427
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106437
5 changed files with 46 additions and 21 deletions

View File

@ -363,7 +363,8 @@ pecoff_load_file(struct thread * td, const char *file, u_long * addr, u_long * e
* Initialize part of the common data
*/
imgp->proc = td->td_proc;
imgp->uap = NULL;
imgp->userspace_argv = NULL;
imgp->userspace_envv = NULL;
imgp->attr = &attr;
imgp->firstpage = NULL;

View File

@ -514,7 +514,8 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr,
* Initialize part of the common data
*/
imgp->proc = p;
imgp->uap = NULL;
imgp->userspace_argv = NULL;
imgp->userspace_envv = NULL;
imgp->attr = attr;
imgp->firstpage = NULL;
imgp->image_header = (char *)kmem_alloc_wait(exec_map, PAGE_SIZE);

View File

@ -120,7 +120,7 @@ exec_shell_imgact(imgp)
}
}
imgp->argv0 = imgp->uap->fname;
imgp->argv0 = imgp->fname;
return(0);
}

View File

@ -76,6 +76,8 @@ static MALLOC_DEFINE(M_ATEXEC, "atexec", "atexec callback");
static int sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS);
static int sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS);
static int kern_execve(struct thread *td, char *fname, char **argv,
char **envv);
/*
* callout list for things to do at exec time
@ -135,23 +137,18 @@ sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS)
*/
static const struct execsw **execsw;
#ifndef _SYS_SYSPROTO_H_
struct execve_args {
char *fname;
char **argv;
char **envv;
};
#endif
/*
* execve() system call.
* In-kernel implementation of execve(). All arguments are assumed to be
* userspace pointers from the passed thread.
*
* MPSAFE
*/
int
execve(td, uap)
static int
kern_execve(td, fname, argv, envv)
struct thread *td;
register struct execve_args *uap;
char *fname;
char **argv;
char **envv;
{
struct proc *p = td->td_proc;
struct nameidata nd, *ndp;
@ -203,7 +200,8 @@ execve(td, uap)
* Initialize part of the common data
*/
imgp->proc = p;
imgp->uap = uap;
imgp->userspace_argv = argv;
imgp->userspace_envv = envv;
imgp->attr = &attr;
imgp->argc = imgp->envc = 0;
imgp->argv0 = NULL;
@ -239,7 +237,7 @@ execve(td, uap)
*/
ndp = &nd;
NDINIT(ndp, LOOKUP, LOCKLEAF | FOLLOW | SAVENAME,
UIO_USERSPACE, uap->fname, td);
UIO_USERSPACE, fname, td);
mtx_lock(&Giant);
interpret:
@ -252,7 +250,7 @@ execve(td, uap)
}
imgp->vp = ndp->ni_vp;
imgp->fname = uap->fname;
imgp->fname = fname;
/*
* Check file permissions (also 'opens' file)
@ -624,6 +622,30 @@ execve(td, uap)
return (error);
}
#ifndef _SYS_SYSPROTO_H_
struct execve_args {
char *fname;
char **argv;
char **envv;
};
#endif
/*
* MPSAFE
*/
int
execve(td, uap)
struct thread *td;
struct execve_args /* {
syscallarg(char *) fname;
syscallarg(char **) argv;
syscallarg(char **) envv;
} */ *uap;
{
return (kern_execve(td, uap->fname, uap->argv, uap->envv));
}
int
exec_map_first_page(imgp)
struct image_params *imgp;
@ -799,7 +821,7 @@ exec_extract_strings(imgp)
* extract arguments first
*/
argv = imgp->uap->argv;
argv = imgp->userspace_argv;
if (argv) {
argp = (caddr_t)(intptr_t)fuword(argv);
@ -832,7 +854,7 @@ exec_extract_strings(imgp)
* extract environment strings
*/
envv = imgp->uap->envv;
envv = imgp->userspace_envv;
if (envv) {
while ((envp = (caddr_t)(intptr_t)fuword(envv++))) {

View File

@ -44,7 +44,8 @@ struct vm_object;
struct image_params {
struct proc *proc; /* our process struct */
struct execve_args *uap; /* syscall arguments */
char **userspace_argv; /* system call argument */
char **userspace_envv; /* system call argument */
struct vnode *vp; /* pointer to vnode of file to exec */
struct vm_object *object; /* The vm object for this vp */
struct vattr *attr; /* attributes of file */