From: Linus Torvalds <torvalds@linux-foundation.org>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Simon Holm Th?gersen <odie@cs.aau.dk>,
Andrew Morton <akpm@linux-foundation.org>,
Davide Libenzi <davidel@xmailserver.org>,
Ingo Molnar <mingo@elte.hu>, Roland McGrath <roland@redhat.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/2] fix the long standing exec vs kill race
Date: Sun, 2 Dec 2007 12:26:26 -0800 (PST) [thread overview]
Message-ID: <alpine.LFD.0.9999.0712021218290.8458@woody.linux-foundation.org> (raw)
In-Reply-To: <20071202171805.GA14701@tv-sign.ru>
On Sun, 2 Dec 2007, Oleg Nesterov wrote:
>
> exec() from the signal handler doesn't do sys_sigreturn(), so we don't unblock
> the signal, and it remains blocked after exec().
>
> Hmm. Is this linux bug, or application bug?
I think that's an application bug.
The kernel does the obvious (and required) thing: it preserves the
list of blocked signals over the execve(). And if you call execve() from
within a signal handler, that list of blocked signals will obviously
include the signals that got blocked by the execution of the signal
itself.
(Side note: I also suspect that the program is not strictly POSIX
conforming, and that execve() isn't in the list of functions that are safe
to call from a signal handler in the first place, but that's a totally
separate issue).
So if havign the signal blocked isn't what the application wants, I'd
suggest one of:
- just set the signal mask by hand to whatever mask you want (perhaps
also marking the signal handler with SIGIGN or SIGDFL or whatever)
- alternatively, if you control the program being execve'd, just do it in
that progam instead.
- use siglongjmp in the signal handler to get out of the signal handler
context and do it that way.
- use a "sigatomic_t" flag, set it in the signal handler, and then do the
execve() in the main loop if it's set.
The last one is the safest one in many ways (since it doesn't care if you
get a hundred of those signals in close succession - and you could also
make it a counter or something if you want to actually count those
things).
Linus
next prev parent reply other threads:[~2007-12-02 20:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-02 15:14 Oleg Nesterov
2007-12-02 17:06 ` Simon Holm Thøgersen
2007-12-02 17:18 ` Oleg Nesterov
2007-12-02 18:08 ` Simon Holm Thøgersen
2007-12-02 18:52 ` Oleg Nesterov
2007-12-02 20:26 ` Linus Torvalds [this message]
2007-12-03 16:37 ` Linus Torvalds
2007-12-03 17:41 ` Oleg Nesterov
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=alpine.LFD.0.9999.0712021218290.8458@woody.linux-foundation.org \
--to=torvalds@linux-foundation.org \
--cc=akpm@linux-foundation.org \
--cc=davidel@xmailserver.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=odie@cs.aau.dk \
--cc=oleg@tv-sign.ru \
--cc=roland@redhat.com \
/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
all inboxes | Powered by JetHome®