From: GOTO Masanori <gotom@sanori.org>
To: akpm@osdl.org, linux-kernel@vger.kernel.org
Cc: gotom@sanori.org
Subject: [PATCH] Fix sigaltstack corruption among cloned threads
Date: Mon, 13 Mar 2006 17:52:05 +0900 [thread overview]
Message-ID: <81ek16loay.wl%gotom@sanori.org> (raw)
This patch fixes alternate signal stack corruption among cloned threads with
CLONE_SIGHAND (and CLONE_VM) for linux-2.6.16-rc6.
The value of alternate signal stack is currently inherited after a call of
clone(... CLONE_SIGHAND | CLONE_VM). But if sigaltstack is set by a parent
thread, and then if multiple cloned child threads (+ parent threads) call
signal handler at the same time, some threads may be conflicted - because they
share to use the same alternative signal stack region. Finally they get
sigsegv. It's an undesirable race condition. Note that child threads created
from NPTL pthread_create() also hit this conflict when the parent thread uses
sigaltstack, without my patch.
To fix this problem, this patch clears the child threads' sigaltstack
information like exec(). This behavior follows the SUSv3 specification. In
SUSv3, pthread_create() says "The alternate stack shall not be inherited (when
new threads are initialized)". It means that sigaltstack should be cleared
when sigaltstack memory space is shared by cloned threads with CLONE_SIGHAND.
Note that I chose "if (clone_flags & CLONE_SIGHAND)" line because:
- If clone_flags line is not existed, fork() does not inherit sigaltstack.
- CLONE_VM is another choice, but vfork() does not inherit sigaltstack.
- CLONE_SIGHAND implies CLONE_VM, and it looks suitable.
- CLONE_THREAD is another candidate, and includes CLONE_SIGHAND + CLONE_VM,
but this flag has a bit different semantics.
I decided to use CLONE_SIGHAND.
-- gotom
Signed-Off-By: GOTO Masanori <gotom@sanori.org>
--- linux-2.6.16-rc6.gotom/kernel/fork.c 2006-03-13 14:45:50.686049000 +0900
+++ linux-2.6.16-rc6/kernel/fork.c 2006-03-13 14:47:24.162839240 +0900
@@ -1062,6 +1062,13 @@ static task_t *copy_process(unsigned lon
p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL;
/*
+ * sigaltstack should be cleared when CLONE_SIGHAND (and CLONE_VM) is
+ * specified.
+ */
+ if (clone_flags & CLONE_SIGHAND)
+ p->sas_ss_sp = p->sas_ss_size = 0;
+
+ /*
* Syscall tracing should be turned off in the child regardless
* of CLONE_PTRACE.
*/
next reply other threads:[~2006-03-13 8:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-13 8:52 GOTO Masanori [this message]
2006-03-13 15:16 ` Ulrich Drepper
2006-03-13 15:30 ` Jakub Jelinek
2006-03-13 16:29 ` Ulrich Drepper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=81ek16loay.wl%gotom@sanori.org \
--to=gotom@sanori.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome