diff options
author | mjg <mjg@FreeBSD.org> | 2014-07-07 14:03:30 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2014-07-07 14:03:30 +0000 |
commit | 8a494537a45d1489756bac657cf9caf4186ebdd3 (patch) | |
tree | cf7ec1cd65a082975ed34b6b01ead748163442d7 /sys/kern/kern_exec.c | |
parent | aef4aec0ff50aa72f161c3ba70e5ecc7ae186fc2 (diff) | |
download | FreeBSD-src-8a494537a45d1489756bac657cf9caf4186ebdd3.zip FreeBSD-src-8a494537a45d1489756bac657cf9caf4186ebdd3.tar.gz |
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
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r-- | sys/kern/kern_exec.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 860820a..489096b 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -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. |