summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2014-08-17 06:54:49 +0000
committermjg <mjg@FreeBSD.org>2014-08-17 06:54:49 +0000
commit9cebe2439f977c8692f96fcac318dc4a09891ad4 (patch)
treeb59b4df0c0ca054e740038d94d098fb594dceeaf /sys/kern
parentf377401ca1805797120d71090b9ebe10d945f91a (diff)
downloadFreeBSD-src-9cebe2439f977c8692f96fcac318dc4a09891ad4.zip
FreeBSD-src-9cebe2439f977c8692f96fcac318dc4a09891ad4.tar.gz
MFC r268087:
Don't call crcopysafe or uifind unnecessarily in execve.
Diffstat (limited to 'sys/kern')
-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 3738b89..0d4923f 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -339,7 +339,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;
@@ -604,8 +604,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)) {
@@ -634,7 +632,7 @@ interpret:
PROC_LOCK(p);
if (oldsigacts)
p->p_sigacts = newsigacts;
- oldcred = crcopysafe(p, newcred);
+ oldcred = p->p_ucred;
/* Stop profiling */
stopprofclock(p);
@@ -724,6 +722,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.
@@ -748,7 +748,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)
@@ -767,10 +766,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;
}
}
@@ -847,11 +848,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