From: "Eric W. Biederman" <ebiederm@xmission.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@kernel.org>, Kees Cook <kees@kernel.org>,
Kusaram Devineni <kusaram@devineni.in>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@kernel.org>,
Will Drewry <wad@chromium.org>,
linux-kernel@vger.kernel.org, Oleg Nesterov <oleg@redhat.com>
Subject: [PATCH 09/11] signal: Dequeue fatal signals
Date: Fri, 26 Jun 2026 11:59:06 -0500 [thread overview]
Message-ID: <878q818ch1.fsf_-_@email.froward.int.ebiederm.org> (raw)
In-Reply-To: <87o6gx9rc4.fsf@email.froward.int.ebiederm.org> (Eric W. Biederman's message of "Fri, 26 Jun 2026 11:52:43 -0500")
Fatal signals are detected early and historically have not been
dequeued. This barely matters as the process exits immediately.
Not dequeuing the signal is visible to userspace inspecting the dying
process through proc and will be to coredumps once we start using
short circuit delivery for them.
To keep things simple always populate siginfo in dequeue_exit_signal
and always pass the dequeueed siginfo to trace_signal_deliver.
In the slim chance that the fatal signal was a posix timer free the
posix timer's sigqueue. In general this is not safe with
tasklist_lock held because tasklist_lock needs to nest under it_lock.
In this case I have read through posixtimer_sigqueue_putref and I can
not find it taking the timer's it_lock.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
include/linux/sched/signal.h | 1 +
kernel/signal.c | 40 ++++++++++++++++++++++++++++--------
2 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
index 1ea0a89cbef0..df7a3c4530e4 100644
--- a/include/linux/sched/signal.h
+++ b/include/linux/sched/signal.h
@@ -262,6 +262,7 @@ struct signal_struct {
#define SIGNAL_STOP_STOPPED 0x00000001 /* job control stop in effect */
#define SIGNAL_STOP_CONTINUED 0x00000002 /* SIGCONT since WCONTINUED reap */
#define SIGNAL_GROUP_EXIT 0x00000004 /* group exit in progress */
+#define SIGNAL_EXIT_DEQUEUE 0x00000008 /* Dequeue the exit signal */
/*
* Pending notifications to parent.
*/
diff --git a/kernel/signal.c b/kernel/signal.c
index 89075c60b92b..ce3a99573aa9 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -665,6 +665,34 @@ int dequeue_signal(sigset_t *mask, kernel_siginfo_t *info, enum pid_type *type)
}
EXPORT_SYMBOL_GPL(dequeue_signal);
+static int dequeue_exit_signal(
+ struct task_struct *tsk, int exit_code, kernel_siginfo_t *info)
+{
+ struct signal_struct *signal = tsk->signal;
+
+ if (signal->flags & SIGNAL_EXIT_DEQUEUE) {
+ struct sigpending *pending = NULL;
+ struct sigqueue *timer_sigq;
+ int signr = exit_code;
+
+ signal->flags &= ~SIGNAL_EXIT_DEQUEUE;
+
+ pending = sigismember(&tsk->pending.signal, signr) ?
+ &tsk->pending : &signal->shared_pending;
+
+ collect_signal(signr, pending, info, &timer_sigq);
+ if (unlikely(timer_sigq)) {
+ posixtimer_sigqueue_putref(timer_sigq);
+ }
+ return signr;
+ }
+ /* There is no short-circuit signal to dequeue -- fake something */
+ clear_siginfo(info);
+ info->si_signo = SIGKILL;
+ info->si_code = SI_KERNEL;
+ return info->si_signo;
+}
+
static int dequeue_synchronous_signal(kernel_siginfo_t *info)
{
struct task_struct *tsk = current;
@@ -1012,7 +1040,7 @@ static void complete_signal(int sig, struct task_struct *p, enum pid_type type)
* running and doing things after a slower
* thread has the fatal signal pending.
*/
- signal->flags = SIGNAL_GROUP_EXIT;
+ signal->flags = SIGNAL_GROUP_EXIT | SIGNAL_EXIT_DEQUEUE;
signal->group_exit_code = sig;
signal->group_stop_count = 0;
__for_each_thread(signal, t) {
@@ -2874,15 +2902,11 @@ bool get_signal(struct ksignal *ksig)
signal->group_exec_task) {
if (signal->flags & SIGNAL_GROUP_EXIT)
exit_code = signal->group_exit_code;
- signr = SIGKILL;
sigdelset(¤t->pending.signal, SIGKILL);
- trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
- &sighand->action[SIGKILL-1]);
+ signr = dequeue_exit_signal(current, exit_code, &ksig->info);
+ trace_signal_deliver(signr, &ksig->info,
+ &sighand->action[signr-1]);
recalc_sigpending();
- /*
- * implies do_group_exit() or return to PF_USER_WORKER,
- * no need to initialize ksig->info/etc.
- */
goto fatal;
}
--
2.41.0
next prev parent reply other threads:[~2026-06-26 16:59 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-19 13:27 [PATCH v2 1/3] signal: change force_sig_info_to_task() to call __send_signal_locked() Oleg Nesterov
2026-06-19 13:27 ` [PATCH v2 2/3] signal: turn the "bool force" arg of __send_signal_locked() into "int flags" Oleg Nesterov
2026-07-06 13:23 ` Bradley Morgan
2026-06-19 13:28 ` [PATCH v2 3/3] signal: fix evasion of SA_IMMUTABLE signals Oleg Nesterov
2026-07-06 13:23 ` Bradley Morgan
2026-06-26 16:52 ` [PATCH 0/11] Short circuit delivery for coredump signals Eric W. Biederman
2026-06-26 16:54 ` [PATCH 01/11] signal: Compute the exit_code in get_signal Eric W. Biederman
2026-06-26 16:54 ` [PATCH 02/11] signal: In get_signal call do_exit when it is unnecessary to shoot down threads Eric W. Biederman
2026-06-26 16:55 ` [PATCH 03/11] signal: Bring down all threads when handling a non-coredump fatal signal Eric W. Biederman
2026-06-26 16:55 ` [PATCH 04/11] signal: Move stopping for the coredump from do_exit into get_signal Eric W. Biederman
2026-06-26 16:56 ` [PATCH 05/11] signal: Move audit_core_dumps from do_coredump " Eric W. Biederman
2026-06-26 16:57 ` [PATCH 06/11] coredump: In zap_threads complete startup if there is no need to wait Eric W. Biederman
2026-06-26 16:57 ` [PATCH 07/11] signal: Use the thread killing in get_signal for coredumps Eric W. Biederman
2026-06-26 16:58 ` [PATCH 08/11] exit: Make do_group_exit static Eric W. Biederman
2026-06-26 16:59 ` Eric W. Biederman [this message]
2026-06-26 16:59 ` [PATCH 10/11] signal: Short circuit deliver coredump signals Eric W. Biederman
2026-06-26 17:00 ` [PATCH 11/11] signal: Remove SA_IMMUTABLE Eric W. Biederman
2026-06-28 14:29 ` [PATCH 0/11] Short circuit delivery for coredump signals Oleg Nesterov
2026-06-29 6:22 ` Eric W. Biederman
2026-06-29 17:45 ` Eric W. Biederman
2026-07-02 10:36 ` Oleg Nesterov
2026-07-03 20:16 ` Eric W. Biederman
2026-07-05 15:54 ` Oleg Nesterov
2026-07-06 9:21 ` Christian Brauner
2026-07-06 12:30 ` Eric W. Biederman
2026-07-06 15:58 ` Christian Brauner
2026-07-03 21:35 ` [PATCH v2 00/14] " Eric W. Biederman
2026-07-03 21:36 ` [PATCH 01/14] signal: Generalize posixtimer_queue_sigqueue into enqueue_signal Eric W. Biederman
2026-07-06 12:54 ` Bradley Morgan
2026-07-07 11:21 ` Oleg Nesterov
2026-07-07 12:23 ` Eric W. Biederman
2026-07-03 21:37 ` [PATCH 02/14] signal: Factor out sig_blocked from sig_ignored Eric W. Biederman
2026-07-06 13:01 ` Bradley Morgan
2026-07-03 21:37 ` [PATCH 03/14] signal: More accurate ignoring of signals based on sig_can_short_circuit Eric W. Biederman
2026-07-06 13:02 ` Bradley Morgan
2026-07-03 21:38 ` [PATCH 04/14] signal: Use sig_can_short_circuit to improve fatal signal delivery Eric W. Biederman
2026-07-06 13:03 ` Bradley Morgan
2026-07-03 21:39 ` [PATCH 05/14] signal: Compute the exit_code in get_signal Eric W. Biederman
2026-07-06 13:03 ` Bradley Morgan
2026-07-03 21:39 ` Eric W. Biederman
2026-07-03 21:40 ` [PATCH 06/14] signal: In get_signal call do_exit when it is unnecessary to shoot down threads Eric W. Biederman
2026-07-06 13:04 ` Bradley Morgan
2026-07-03 21:40 ` [PATCH 07/14] signal: Bring down all threads when handling a non-coredump fatal signal Eric W. Biederman
2026-07-06 13:05 ` Bradley Morgan
2026-07-03 21:41 ` [PATCH 08/14] signal: Move stopping for the coredump from do_exit into get_signal Eric W. Biederman
2026-07-06 13:08 ` Bradley Morgan
2026-07-03 21:41 ` [PATCH 09/14] signal: Move audit_core_dumps from do_coredump " Eric W. Biederman
2026-07-06 13:08 ` Bradley Morgan
2026-07-03 21:42 ` [PATCH 10/14] coredump: In zap_threads complete startup if there is no need to wait Eric W. Biederman
2026-07-06 13:09 ` Bradley Morgan
2026-07-03 21:43 ` [PATCH 11/14] signal: Use the thread killing in get_signal for coredumps Eric W. Biederman
2026-07-06 13:13 ` Bradley Morgan
2026-07-03 21:43 ` [PATCH 12/14] exit: Make do_group_exit static Eric W. Biederman
2026-07-06 13:14 ` Bradley Morgan
2026-07-03 21:44 ` [PATCH 13/14] signal: Dequeue fatal signals Eric W. Biederman
2026-07-06 13:16 ` Bradley Morgan
2026-07-03 21:44 ` [PATCH 14/14] signal: Short circuit deliver coredump signals Eric W. Biederman
2026-07-06 13:17 ` Bradley Morgan
2026-07-07 11:13 ` [PATCH v2 00/14] Short circuit delivery for " Oleg Nesterov
2026-07-07 12:15 ` Oleg Nesterov
2026-07-09 11:59 ` Eric W. Biederman
2026-07-10 14:58 ` Oleg Nesterov
2026-07-09 12:28 ` Eric W. Biederman
2026-07-06 13:18 ` [PATCH 0/11] " Bradley Morgan
2026-07-06 13:23 ` [PATCH v2 1/3] signal: change force_sig_info_to_task() to call __send_signal_locked() Bradley Morgan
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=878q818ch1.fsf_-_@email.froward.int.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=akpm@linux-foundation.org \
--cc=kees@kernel.org \
--cc=kusaram@devineni.in \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@kernel.org \
--cc=wad@chromium.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