summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2014-07-01 09:21:32 +0000
committermjg <mjg@FreeBSD.org>2014-07-01 09:21:32 +0000
commit24f1528d0b11955279622c3f86431f4b83f6af60 (patch)
tree3f4a1be711391aa5553c3899fede186b72010573 /sys/kern/kern_exec.c
parent0b2372b19519751cb4401277788ddabf61585521 (diff)
downloadFreeBSD-src-24f1528d0b11955279622c3f86431f4b83f6af60.zip
FreeBSD-src-24f1528d0b11955279622c3f86431f4b83f6af60.tar.gz
Don't call crcopysafe or uifind unnecessarily in execve.
MFC after: 1 week
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r--sys/kern/kern_exec.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 91d161d..cce687b 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -336,7 +336,7 @@ do_execve(td, args, mac_p)
struct proc *p = td->td_proc;
struct nameidata nd;
struct ucred *newcred = NULL, *oldcred;
- struct uidinfo *euip;
+ struct uidinfo *euip = NULL;
register_t *stack_base;
int error, i;
struct image_params image_params, *imgp;
@@ -601,8 +601,6 @@ interpret:
/*
* Malloc things before we need locks.
*/
- newcred = crget();
- euip = uifind(attr.va_uid);
i = imgp->args->begin_envv - imgp->args->begin_argv;
/* Cache arguments if they fit inside our allowance */
if (ps_arg_cache_limit >= i + sizeof(struct pargs)) {
@@ -631,7 +629,7 @@ interpret:
PROC_LOCK(p);
if (oldsigacts)
p->p_sigacts = newsigacts;
- oldcred = crcopysafe(p, newcred);
+ oldcred = p->p_ucred;
/* Stop profiling */
stopprofclock(p);
@@ -721,6 +719,8 @@ interpret:
vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
if (error != 0)
goto done1;
+ newcred = crdup(oldcred);
+ euip = uifind(attr.va_uid);
PROC_LOCK(p);
/*
* Set the new credentials.
@@ -745,7 +745,6 @@ interpret:
change_svuid(newcred, newcred->cr_uid);
change_svgid(newcred, newcred->cr_gid);
p->p_ucred = newcred;
- newcred = NULL;
} else {
if (oldcred->cr_uid == oldcred->cr_ruid &&
oldcred->cr_gid == oldcred->cr_rgid)
@@ -764,10 +763,12 @@ interpret:
*/
if (oldcred->cr_svuid != oldcred->cr_uid ||
oldcred->cr_svgid != oldcred->cr_gid) {
+ PROC_UNLOCK(p);
+ newcred = crdup(oldcred);
+ PROC_LOCK(p);
change_svuid(newcred, newcred->cr_uid);
change_svgid(newcred, newcred->cr_gid);
p->p_ucred = newcred;
- newcred = NULL;
}
}
@@ -844,11 +845,10 @@ done1:
/*
* Free any resources malloc'd earlier that we didn't use.
*/
- uifree(euip);
- if (newcred == NULL)
+ if (euip != NULL)
+ uifree(euip);
+ if (newcred != NULL)
crfree(oldcred);
- else
- crfree(newcred);
VOP_UNLOCK(imgp->vp, 0);
/*
OpenPOWER on IntegriCloud