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:
parent
f8d0815040
commit
450ffb4427
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106437
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -120,7 +120,7 @@ exec_shell_imgact(imgp)
|
||||
}
|
||||
}
|
||||
|
||||
imgp->argv0 = imgp->uap->fname;
|
||||
imgp->argv0 = imgp->fname;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
@ -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++))) {
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user