lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 29 May 2012 18:59:08 -0400
From:	Filipe Brandenburger <filbranden@...il.com>
To:	Oleg Nesterov <oleg@...hat.com>, Tejun Heo <tj@...nel.org>,
	Andrew Morton <akpm@...ux-foundation.org>,
	David Rientjes <rientjes@...gle.com>,
	Peter Zijlstra <a.p.zijlstra@...llo.nl>
Cc:	linux-kernel@...r.kernel.org,
	Filipe Brandenburger <filbranden@...il.com>
Subject: [PATCH 1/1] prctl: pdeath_signal sent when parent thread (instead of parent process) dies

On a case where a child process uses prctl(PR_SET_PDEATHSIG, signo) to
request that it is sent a signal when the parent process dies, if that
child process was forked by a thread of a multi-threaded process, then
it will receive the signal when the thread terminates, when in fact it
is interested on whether the parent process died instead.

When a process is forked, it is added to the children to the task_struct
that forked it, so that will be the thread that did it. When the thread
terminates, forget_original_parent() will reparent the children by
assigning them a new reaper. In the case of a multi-threaded process,
the new reaper will be another thread in the same thread group.

The patch just adds another check to the case where pdeath_signal is set
in forget_original_parent() to verify whether the tgid of the original
and new parent process are the same and to skip sending the signal in
that particular case.

For more discussion and test cases executed:
https://bugzilla.kernel.org/show_bug.cgi?id=43300

Signed-off-by: Filipe Brandenburger <filbranden@...il.com>
---
 kernel/exit.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/kernel/exit.c b/kernel/exit.c
index 910a071..ed439cd 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -806,7 +806,8 @@ static void forget_original_parent(struct task_struct *father)
 				BUG_ON(t->ptrace);
 				t->parent = t->real_parent;
 			}
-			if (t->pdeath_signal)
+			if (t->pdeath_signal &&
+			    !same_thread_group(father, reaper))
 				group_send_sig_info(t->pdeath_signal,
 						    SEND_SIG_NOINFO, t);
 		} while_each_thread(p, t);
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ