mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-14 05:52:16 +01:00
[PATCH] Disable CLONE_CHILD_CLEARTID for abnormal exit
The CLONE_CHILD_CLEARTID flag is used by NPTL to have its threads communicate via memory/futex when they exit, so pthread_join can synchronize using a simple futex wait. The word of user memory where NPTL stores a thread's own TID is what it passes; this gets reset to zero at thread exit. It is not desireable to touch this user memory when threads are dying due to a fatal signal. A core dump is more usefully representative of the dying program state if the threads live at the time of the crash have their NPTL data structures unperturbed. The userland expectation of CLONE_CHILD_CLEARTID has only ever been that it works for a thread making an _exit system call. This problem was identified by Ernie Petrides <[email protected]>. Signed-off-by: Roland McGrath <[email protected]> Cc: Ernie Petrides <[email protected]> Cc: Jakub Jelinek <[email protected]> Acked-by: Ingo Molnar <[email protected]> Cc: Ulrich Drepper <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
736c4b8572
commit
fec1d01152
1 file changed
+10
-1
+10
-1
@@ -448,7 +448,16 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
|
||||
tsk->vfork_done = NULL;
|
||||
complete(vfork_done);
|
||||
}
|
||||
if (tsk->clear_child_tid && atomic_read(&mm->mm_users) > 1) {
|
||||
|
||||
/*
|
||||
* If we're exiting normally, clear a user-space tid field if
|
||||
* requested. We leave this alone when dying by signal, to leave
|
||||
* the value intact in a core dump, and to save the unnecessary
|
||||
* trouble otherwise. Userland only wants this done for a sys_exit.
|
||||
*/
|
||||
if (tsk->clear_child_tid
|
||||
&& !(tsk->flags & PF_SIGNALED)
|
||||
&& atomic_read(&mm->mm_users) > 1) {
|
||||
u32 __user * tidptr = tsk->clear_child_tid;
|
||||
tsk->clear_child_tid = NULL;
|
||||
|
||||
|
||||
Reference in new issue
Block a user