diff options
author | mjg <mjg@FreeBSD.org> | 2014-08-17 06:58:14 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2014-08-17 06:58:14 +0000 |
commit | 8fa92f4d0bcf1f1e08a74527ec90f63c26d5b3c4 (patch) | |
tree | 71a197af3ac6b4c7b9861e7fabf065f623ceebf2 /sys/kern | |
parent | 98ac4e9b0867c3a743a97b5d7aae64d69be15973 (diff) | |
download | FreeBSD-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.c | 6 |
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. |