In a threaded process, don't kill off all the other threads until we have a

reasonable chance that the eceve() is going to succeeed. I.e.
wait until we've done the permission checks etc.

MFC after:	1 week
This commit is contained in:
Julian Elischer 2004-09-21 21:05:13 +00:00
parent aa1cb3e183
commit 297800599a

View File

@ -254,17 +254,6 @@ kern_execve(td, fname, argv, envv, mac_p)
PROC_LOCK(p);
KASSERT((p->p_flag & P_INEXEC) == 0,
("%s(): process already has P_INEXEC flag", __func__));
if (p->p_flag & P_HADTHREADS) {
if (thread_single(SINGLE_EXIT)) {
PROC_UNLOCK(p);
mtx_unlock(&Giant);
return (ERESTART); /* Try again later. */
}
/*
* If we get here all other threads are dead,
* and threading mode has been turned off
*/
}
p->p_flag |= P_INEXEC;
PROC_UNLOCK(p);
@ -356,6 +345,23 @@ kern_execve(td, fname, argv, envv, mac_p)
if (error)
goto exec_fail_dealloc;
PROC_LOCK(p);
if (p->p_flag & P_HADTHREADS) {
if (thread_single(SINGLE_EXIT)) {
PROC_UNLOCK(p);
error = ERESTART;
goto exec_fail_dealloc;
}
/*
* If we get here all other threads are dead,
* and threading mode has been turned off.
* Returning to the user from this point on
* may confuse the thread library as some threads
* will have just "died".
*/
}
PROC_UNLOCK(p);
/*
* If the current process has a special image activator it
* wants to try first, call it. For example, emulating shell