summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2014-08-17 06:58:14 +0000
committermjg <mjg@FreeBSD.org>2014-08-17 06:58:14 +0000
commit8fa92f4d0bcf1f1e08a74527ec90f63c26d5b3c4 (patch)
tree71a197af3ac6b4c7b9861e7fabf065f623ceebf2 /sys/kern
parent98ac4e9b0867c3a743a97b5d7aae64d69be15973 (diff)
downloadFreeBSD-src-8fa92f4d0bcf1f1e08a74527ec90f63c26d5b3c4.zip
FreeBSD-src-8fa92f4d0bcf1f1e08a74527ec90f63c26d5b3c4.tar.gz
MFC r268365:
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.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_exec.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 354a4ee..1c67059 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -721,11 +721,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.
@@ -769,7 +769,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);
@@ -846,6 +848,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.
@@ -854,7 +857,6 @@ done1:
uifree(euip);
if (newcred != NULL)
crfree(oldcred);
- VOP_UNLOCK(imgp->vp, 0);
/*
* Handle deferred decrement of ref counts.
OpenPOWER on IntegriCloud