summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-01-19 23:03:31 +0000
committerkib <kib@FreeBSD.org>2012-01-19 23:03:31 +0000
commit35f031ce17a8e05b304e3daec309a8a7cb998c16 (patch)
tree7f8dde8b28efac12514679e2387d182966832f23 /sys/kern
parent0b0dd295c6bd3a76d864996688ca3f6e5b6b9289 (diff)
downloadFreeBSD-src-35f031ce17a8e05b304e3daec309a8a7cb998c16.zip
FreeBSD-src-35f031ce17a8e05b304e3daec309a8a7cb998c16.tar.gz
Use shared lock for the executable vnode in the exec path after the
VV_TEXT changes are handled. Assert that vnode is exclusively locked at the places that modify VV_TEXT. Discussed with: alc MFC after: 3 weeks
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_exec.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 4545848..135f798 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -471,6 +471,7 @@ interpret:
* actually an executable image.
*/
textset = imgp->vp->v_vflag & VV_TEXT;
+ ASSERT_VOP_ELOCKED(imgp->vp, "vv_text");
imgp->vp->v_vflag |= VV_TEXT;
error = exec_map_first_page(imgp);
@@ -502,8 +503,10 @@ interpret:
if (error) {
if (error == -1) {
- if (textset == 0)
+ if (textset == 0) {
+ ASSERT_VOP_ELOCKED(imgp->vp, "vv_text");
imgp->vp->v_vflag &= ~VV_TEXT;
+ }
error = ENOEXEC;
}
goto exec_fail_dealloc;
@@ -596,7 +599,7 @@ interpret:
/* close files on exec */
fdcloseexec(td);
- vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
/* Get a reference to the vnode prior to locking the proc */
VREF(binvp);
@@ -701,7 +704,7 @@ interpret:
VOP_UNLOCK(imgp->vp, 0);
setugidsafety(td);
error = fdcheckstd(td);
- vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
if (error != 0)
goto done1;
PROC_LOCK(p);
@@ -805,7 +808,7 @@ interpret:
pe.pm_entryaddr = imgp->entry_addr;
PMC_CALL_HOOK_X(td, PMC_FN_PROCESS_EXEC, (void *) &pe);
- vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
} else
PROC_UNLOCK(p);
#else /* !HWPMC_HOOKS */
@@ -857,7 +860,7 @@ done1:
if (tracecred != NULL)
crfree(tracecred);
#endif
- vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY);
+ vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
pargs_drop(oldargs);
pargs_drop(newargs);
if (oldsigacts != NULL)
OpenPOWER on IntegriCloud