Fix a race between file operations and rfork(RFCFDG) by parking
all other threads at user boundary, the race can crash kernel under stress testing. Reviewed by: jhb MFC after: 3 days
This commit is contained in:
parent
83a244dbe0
commit
795a11d049
@ -220,6 +220,16 @@ fork1(td, flags, pages, procp)
|
||||
* certain parts of a process from itself.
|
||||
*/
|
||||
if ((flags & RFPROC) == 0) {
|
||||
if ((p1->p_flag & P_HADTHREADS) &&
|
||||
(flags & (RFCFDG | RFFDG))) {
|
||||
PROC_LOCK(p1);
|
||||
if (thread_single(SINGLE_BOUNDARY)) {
|
||||
PROC_UNLOCK(p1);
|
||||
return (ERESTART);
|
||||
}
|
||||
PROC_UNLOCK(p1);
|
||||
}
|
||||
|
||||
vm_forkproc(td, NULL, NULL, flags);
|
||||
|
||||
/*
|
||||
@ -237,6 +247,13 @@ fork1(td, flags, pages, procp)
|
||||
*/
|
||||
if (flags & RFFDG)
|
||||
fdunshare(p1, td);
|
||||
|
||||
if ((p1->p_flag & P_HADTHREADS) &&
|
||||
(flags & (RFCFDG | RFFDG))) {
|
||||
PROC_LOCK(p1);
|
||||
thread_single_end();
|
||||
PROC_UNLOCK(p1);
|
||||
}
|
||||
*procp = NULL;
|
||||
return (0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user