summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2004-03-05 22:38:26 +0000
committerjhb <jhb@FreeBSD.org>2004-03-05 22:38:26 +0000
commit445ca6326439a96317576913679ff52f926a55da (patch)
treee6e421d22f070a74c760459813e136943535f482 /sys/kern/kern_exec.c
parentaf72c48e5f93796905ca57930c12e3baf951d1c9 (diff)
downloadFreeBSD-src-445ca6326439a96317576913679ff52f926a55da.zip
FreeBSD-src-445ca6326439a96317576913679ff52f926a55da.tar.gz
Lock Giant around the single threading code in exec() to satisfy an
assertion in the single threading code.
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r--sys/kern/kern_exec.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 4d2a7fe..d4508c6 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -253,12 +253,14 @@ kern_execve(td, fname, argv, envv, mac_p)
* that might allow a local user to illicitly obtain elevated
* privileges.
*/
+ mtx_lock(&Giant);
PROC_LOCK(p);
KASSERT((p->p_flag & P_INEXEC) == 0,
("%s(): process already has P_INEXEC flag", __func__));
if (p->p_flag & P_SA || p->p_numthreads > 1) {
if (thread_single(SINGLE_EXIT)) {
PROC_UNLOCK(p);
+ mtx_unlock(&Giant);
return (ERESTART); /* Try again later. */
}
/*
@@ -269,6 +271,7 @@ kern_execve(td, fname, argv, envv, mac_p)
td->td_mailbox = NULL;
thread_single_end();
}
+ mtx_unlock(&Giant);
p->p_flag |= P_INEXEC;
PROC_UNLOCK(p);
OpenPOWER on IntegriCloud