PERFORCE change 20616 for review

Robert Watson rwatson at freebsd.org
Mon Nov 4 01:00:48 GMT 2002


http://perforce.freebsd.org/chv.cgi?CH=20616

Change 20616 by rwatson at rwatson_tislabs on 2002/11/03 17:00:36

	Break out the imgp->uap argument to make it system-call
	independent.  Implement execve via kern_execve() and wrap
	both __execve_mac() and execve() around it, rather than
	making execve() a wrapper around __execve_mac(), following
	the model used in the main tree for other system calls.
	No semantic change, otherwise.

Affected files ...

.. //depot/projects/trustedbsd/mac/sys/compat/pecoff/imgact_pecoff.c#15 edit
.. //depot/projects/trustedbsd/mac/sys/kern/imgact_elf.c#18 edit
.. //depot/projects/trustedbsd/mac/sys/kern/imgact_shell.c#5 edit
.. //depot/projects/trustedbsd/mac/sys/kern/kern_exec.c#41 edit
.. //depot/projects/trustedbsd/mac/sys/sys/imgact.h#14 edit

Differences ...

==== //depot/projects/trustedbsd/mac/sys/compat/pecoff/imgact_pecoff.c#15 (text+ko) ====

@@ -363,7 +363,10 @@
 	 * Initialize part of the common data
 	 */
 	imgp->proc = td->td_proc;
-	imgp->uap = NULL;
+	imgp->userspace_fname = NULL;
+	imgp->userspace_argv = NULL;
+	imgp->userspace_envv = NULL;
+	imgp->userspace_mac_p = NULL;
 	imgp->attr = &attr;
 	imgp->firstpage = NULL;
 

==== //depot/projects/trustedbsd/mac/sys/kern/imgact_elf.c#18 (text+ko) ====

@@ -514,7 +514,10 @@
 	 * Initialize part of the common data
 	 */
 	imgp->proc = p;
-	imgp->uap = NULL;
+	imgp->userspace_fname = NULL;
+	imgp->userspace_argv = NULL;
+	imgp->userspace_envv = NULL;
+	imgp->userspace_mac_p = NULL;
 	imgp->attr = attr;
 	imgp->firstpage = NULL;
 	imgp->image_header = (char *)kmem_alloc_wait(exec_map, PAGE_SIZE);

==== //depot/projects/trustedbsd/mac/sys/kern/imgact_shell.c#5 (text+ko) ====

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

==== //depot/projects/trustedbsd/mac/sys/kern/kern_exec.c#41 (text+ko) ====

@@ -76,6 +76,9 @@
 
 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, struct mac *mac_p);
+
 
 /*
  * callout list for things to do at exec time
@@ -135,24 +138,19 @@
  */
 static const struct execsw **execsw;
 
-#ifndef _SYS_SYSPROTO_H_
-struct __execve_mac_args {
-        char    *fname; 
-        char    **argv;
-        char    **envv; 
-	struct mac *mac_p;
-};
-#endif
-
 /*
- * __execve_mac() system call.
+ * In-kernel implementation of execve().  All arguments are assumed to
+ * be userspace pointers from the passed thread.
  *
  * MPSAFE
  */
-int
-__execve_mac(td, uap)
+static int
+kern_execve(td, fname, argv, envv, mac_p)
 	struct thread *td;
-	register struct __execve_mac_args *uap;
+	char *fname;
+	char **argv;
+	char **envv;
+	struct mac *mac_p;
 {
 	struct proc *p = td->td_proc;
 	struct nameidata nd, *ndp;
@@ -209,7 +207,10 @@
 	 * Initialize part of the common data
 	 */
 	imgp->proc = p;
-	imgp->uap = uap;
+	imgp->userspace_fname = fname;
+	imgp->userspace_argv = argv;
+	imgp->userspace_envv = envv;
+	imgp->userspace_mac_p = mac_p;
 	imgp->execlabel = NULL;
 	imgp->attr = &attr;
 	imgp->argc = imgp->envc = 0;
@@ -226,7 +227,7 @@
 	imgp->auxarg_size = 0;
 
 #ifdef MAC
-	error = mac_execve_enter(imgp, uap->mac_p, &execlabel);
+	error = mac_execve_enter(imgp, mac_p, &execlabel);
 	if (error) {
 		mtx_lock(&Giant);
 		goto exec_fail;
@@ -254,7 +255,7 @@
 	 */
 	ndp = &nd;
 	NDINIT(ndp, LOOKUP, LOCKLEAF | FOLLOW | SAVENAME | SAVESTART,
-	    UIO_USERSPACE, uap->fname, td);
+	    UIO_USERSPACE, fname, td);
 
 	mtx_lock(&Giant);
 interpret:
@@ -267,7 +268,7 @@
 	}
 
 	imgp->vp = ndp->ni_vp;
-	imgp->fname = uap->fname;
+	imgp->fname = fname;
 
 	/*
 	 * Check file permissions (also 'opens' file, caches various
@@ -684,9 +685,6 @@
 }
 
 /*
- * execve() system call.  This is simply a wrapper for __execve_mac
- * which passes in a NULL label argument.
- *
  * MPSAFE
  */
 int
@@ -698,13 +696,26 @@
 		syscallarg(char **) envv;
 	} */ *uap;
 {
-	struct __execve_mac_args mac_args;
+
+	return (kern_execve(td, uap->fname, uap->argv, uap->envv, NULL));
+}
+
+/*
+ * MPSAFE
+ */
+int
+__execve_mac(td, uap)
+	struct thread *td;
+	struct __execve_mac_args /* {
+		syscallarg(char *) fname;
+		syscallarg(char **) argv;
+		syscallarg(char **) envv;
+		syscallarg(struct mac *) mac_p;
+	} */ *uap;
+{
 
-	mac_args.fname = uap->fname;
-	mac_args.argv = uap->argv;
-	mac_args.envv = uap->envv;
-	mac_args.mac_p = NULL;
-	return (__execve_mac(td, &mac_args));
+	return (kern_execve(td, uap->fname, uap->argv, uap->envv,
+	    uap->mac_p));
 }
 
 int
@@ -882,7 +893,7 @@
 	 * extract arguments first
 	 */
 
-	argv = imgp->uap->argv;
+	argv = imgp->userspace_argv;
 
 	if (argv) {
 		argp = (caddr_t)(intptr_t)fuword(argv);
@@ -915,7 +926,7 @@
 	 * extract environment strings
 	 */
 
-	envv = imgp->uap->envv;
+	envv = imgp->userspace_envv;
 
 	if (envv) {
 		while ((envp = (caddr_t)(intptr_t)fuword(envv++))) {

==== //depot/projects/trustedbsd/mac/sys/sys/imgact.h#14 (text+ko) ====

@@ -45,7 +45,10 @@
 
 struct image_params {
 	struct proc *proc;	/* our process struct */
-	struct __execve_mac_args *uap; /* syscall arguments */
+	char *userspace_fname;	/* system call argument */
+	char **userspace_argv;	/* system call argument */
+	char **userspace_envv;	/* system call argument */
+	struct mac *userspace_mac_p;	/* system call argument */
 	struct label *execlabel; /* MAC label to compose transition with */
 	struct vnode *vp;	/* pointer to vnode of file to exec */
 	struct vm_object *object;	/* The vm object for this vp */
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message



More information about the trustedbsd-cvs mailing list