Revert the last change..
Better to kill all other threads than to panic the system if 2 threads call execve() at the same time. A better fix will be committed later. Note that this only affects the case where the execve fails.
This commit is contained in:
parent
7789933b6a
commit
2e2e32b201
@ -254,6 +254,17 @@ 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);
|
||||
|
||||
@ -345,23 +356,6 @@ 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
|
||||
|
Loading…
Reference in New Issue
Block a user