svn commit: r268365 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Mon Jul 7 14:03:31 UTC 2014
Author: mjg
Date: Mon Jul 7 14:03:30 2014
New Revision: 268365
URL: http://svnweb.freebsd.org/changeset/base/268365
Log:
Don't call crdup nor uifind under vnode lock.
A locked vnode can get into the way of satisyfing malloc with M_WATOK.
This is a fixup to r268087.
Suggested by: kib
MFC after: 1 week
Modified:
head/sys/kern/kern_exec.c
Modified: head/sys/kern/kern_exec.c
==============================================================================
--- head/sys/kern/kern_exec.c Mon Jul 7 11:52:22 2014 (r268364)
+++ head/sys/kern/kern_exec.c Mon Jul 7 14:03:30 2014 (r268365)
@@ -718,11 +718,11 @@ interpret:
VOP_UNLOCK(imgp->vp, 0);
setugidsafety(td);
error = fdcheckstd(td);
- vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
if (error != 0)
goto done1;
newcred = crdup(oldcred);
euip = uifind(attr.va_uid);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
PROC_LOCK(p);
/*
* Set the new credentials.
@@ -766,7 +766,9 @@ interpret:
if (oldcred->cr_svuid != oldcred->cr_uid ||
oldcred->cr_svgid != oldcred->cr_gid) {
PROC_UNLOCK(p);
+ VOP_UNLOCK(imgp->vp, 0);
newcred = crdup(oldcred);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
PROC_LOCK(p);
change_svuid(newcred, newcred->cr_uid);
change_svgid(newcred, newcred->cr_gid);
@@ -843,6 +845,7 @@ interpret:
SDT_PROBE(proc, kernel, , exec__success, args->fname, 0, 0, 0, 0);
+ VOP_UNLOCK(imgp->vp, 0);
done1:
/*
* Free any resources malloc'd earlier that we didn't use.
@@ -851,7 +854,6 @@ done1:
uifree(euip);
if (newcred != NULL)
crfree(oldcred);
- VOP_UNLOCK(imgp->vp, 0);
/*
* Handle deferred decrement of ref counts.
More information about the svn-src-head
mailing list