diff options
author | kib <kib@FreeBSD.org> | 2012-01-19 23:03:31 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2012-01-19 23:03:31 +0000 |
commit | 35f031ce17a8e05b304e3daec309a8a7cb998c16 (patch) | |
tree | 7f8dde8b28efac12514679e2387d182966832f23 /sys/kern | |
parent | 0b0dd295c6bd3a76d864996688ca3f6e5b6b9289 (diff) | |
download | FreeBSD-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.c | 13 |
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) |