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:
parent
aa1cb3e183
commit
297800599a
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user