From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out03.mta.xmission.com (out03.mta.xmission.com [166.70.13.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 975831A267 for ; Fri, 3 Jul 2026 21:44:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=166.70.13.233 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783115068; cv=none; b=OY2ynWD2hDThVYDZWEXhDqBa0Z/bWsMx7KKs1l+kkgBQLJIzI+HjTPSkgWt9JsAhJRsXsBE8iCR78k1I4ypWn/gGlCYrPq84FDgaXvGhzejeeb+MC6iHVP6Xvsgs/xFU1OefM7zYFO+3ti56I9gRvhdJybO/mk+TX9FwaPtOV1w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783115068; c=relaxed/simple; bh=OvG25YL9QEHEuWKHxlKeD6YQaTO2D0SHa2sAktzFtYQ=; h=From:To:Cc:In-Reply-To:References:Date:Message-ID:MIME-Version: Content-Type:Subject; b=CmH1DzrhN/HL059iohGWk/Dsj5V7Pq21tfWw+z5olUn4z6FesOTOgiFaOWg+2llnDFSl9c29bAEcYFQgMDlB+YqV6rxYVyzQm/kWYg+1kj8eiSuySphs1n9mqkwsPGJbUuKOUM8OnmZjfS4Ur6uPfm0lNxKWsgCvGcgRhVmBuaw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xmission.com; spf=pass smtp.mailfrom=xmission.com; dkim=pass (1024-bit key) header.d=xmission.com header.i=@xmission.com header.b=AJxmzPVl; arc=none smtp.client-ip=166.70.13.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xmission.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=xmission.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=xmission.com header.i=@xmission.com header.b="AJxmzPVl" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=simple/simple; d=xmission.com; s=xmission; h=Subject:Content-Type:MIME-Version:Message-ID:Date:References: In-Reply-To:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=OvG25YL9QEHEuWKHxlKeD6YQaTO2D0SHa2sAktzFtYQ=; b=AJxmzPVl37mQaPiEjyXIRDnjRM ahNhjflDDM6tea08uond+G/fUgDOtKzxFKSnY+UbMxRvXRYSRZlIxoaASceY+YC49xe3pN+wKArc1 CU/74ef5Hrot4zI1mRKl0PR7j2WrhSosih3Fm39X7cKcvPkiCI2kaJBBPOqAaPATL6/Y=; Received: from in01.mta.xmission.com ([166.70.13.51]:59692) by out03.mta.xmission.com with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1wflgQ-00HZZi-VL; Fri, 03 Jul 2026 15:44:26 -0600 Received: from ip72-198-198-28.om.om.cox.net ([72.198.198.28]:60636 helo=email.froward.int.ebiederm.org.xmission.com) by in01.mta.xmission.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1wflgP-00DmfK-VG; Fri, 03 Jul 2026 15:44:26 -0600 From: "Eric W. Biederman" To: Oleg Nesterov Cc: Andrew Morton , Andy Lutomirski , Kees Cook , Kusaram Devineni , Peter Zijlstra , Thomas Gleixner , Will Drewry , linux-kernel@vger.kernel.org, Linus Torvalds , Christian Brauner In-Reply-To: <877bnb4uyw.fsf_-_@email.froward.int.ebiederm.org> (Eric W. Biederman's message of "Fri, 03 Jul 2026 16:35:51 -0500") References: <87o6gx9rc4.fsf@email.froward.int.ebiederm.org> <877bnh7tnf.fsf@email.froward.int.ebiederm.org> <877bnb4uyw.fsf_-_@email.froward.int.ebiederm.org> Date: Fri, 03 Jul 2026 16:44:20 -0500 Message-ID: <87v7avzr2j.fsf_-_@email.froward.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1wflgP-00DmfK-VG;;;mid=<87v7avzr2j.fsf_-_@email.froward.int.ebiederm.org>;;;hst=in01.mta.xmission.com;;;ip=72.198.198.28;;;frm=ebiederm@xmission.com;;;sPfnum=0;;;sPf=pass X-XM-AID: U2FsdGVkX19BUxAH2B0/XTWz8iU80k5QQd52F3jH13Q= X-Spam-Level: X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP * 0.1 BAYES_50 BODY: Bayes spam probability is 40 to 60% * [score: 0.4999] * 1.5 XMNoVowels Alpha-numberic number with no vowels * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa07 1397; Body=1 Fuz1=1 Fuz2=1] X-Spam-DCC: XMission; sa07 1397; Body=1 Fuz1=1 Fuz2=1 X-Spam-Combo: ;Oleg Nesterov X-Spam-Relay-Country: X-Spam-Timing: total 552 ms - load_scoreonly_sql: 0.04 (0.0%), signal_user_changed: 13 (2.3%), b_tie_ro: 11 (2.1%), parse: 0.94 (0.2%), extract_message_metadata: 12 (2.1%), get_uri_detail_list: 1.86 (0.3%), tests_pri_-2000: 13 (2.3%), tests_pri_-1000: 2.6 (0.5%), tests_pri_-950: 1.16 (0.2%), tests_pri_-900: 0.98 (0.2%), tests_pri_-90: 58 (10.5%), check_bayes: 57 (10.3%), b_tokenize: 9 (1.6%), b_tok_get_all: 8 (1.4%), b_comp_prob: 2.1 (0.4%), b_tok_touch_all: 35 (6.4%), b_finish: 0.79 (0.1%), tests_pri_0: 440 (79.6%), check_dkim_signature: 0.54 (0.1%), check_dkim_adsp: 2.8 (0.5%), poll_dns_idle: 1.04 (0.2%), tests_pri_10: 2.1 (0.4%), tests_pri_500: 7 (1.3%), rewrite_mail: 0.00 (0.0%) Subject: [PATCH 13/14] signal: Dequeue fatal signals X-SA-Exim-Connect-IP: 166.70.13.51 X-SA-Exim-Rcpt-To: brauner@kernel.org, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, wad@chromium.org, tglx@kernel.org, peterz@infradead.org, kusaram@devineni.in, kees@kernel.org, luto@kernel.org, akpm@linux-foundation.org, oleg@redhat.com X-SA-Exim-Mail-From: ebiederm@xmission.com X-SA-Exim-Scanned: No (on out03.mta.xmission.com); SAEximRunCond expanded to false 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. Update the short circuit delivery for fatal signals to always place the fatal signal on the shared signal queue. To keep things simple always populate siginfo in dequeue_exit_signal and always pass the dequeueed siginfo to trace_signal_deliver. Signed-off-by: "Eric W. Biederman" --- include/linux/sched/signal.h | 1 + kernel/signal.c | 43 +++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h index 4ff1da6b841e..17a5930cf98a 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 674d4b6d0b8a..5bd07a90c689 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -708,6 +708,36 @@ 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; + + /* The default siginfo to return */ + clear_siginfo(info); + info->si_signo = SIGKILL; + info->si_code = SI_KERNEL; + + if (signal->flags & SIGNAL_EXIT_DEQUEUE) { + int sig = exit_code; + signal->flags &= ~SIGNAL_EXIT_DEQUEUE; + + struct sigqueue *q = + list_last_entry_or_null(&signal->shared_pending.list, + struct sigqueue, list); + if (q && (q->info.si_signo == sig)) { + list_del_init(&q->list); + copy_siginfo(info, &q->info); + __sigqueue_free(q); + } else { + info->si_signo = sig; + } + sigdelset(&signal->shared_pending.signal, sig); + } + + return info->si_signo; +} + static int dequeue_synchronous_signal(kernel_siginfo_t *info) { struct task_struct *tsk = current; @@ -1071,7 +1101,8 @@ static void enqueue_signal(struct task_struct *t, enum pid_type type, * running and doing things after a slower * thread has the fatal signal pending. */ - signal->flags = SIGNAL_GROUP_EXIT; + pending = &signal->shared_pending; + signal->flags = SIGNAL_GROUP_EXIT | SIGNAL_EXIT_DEQUEUE; signal->group_exit_code = sig; signal->group_stop_count = 0; __for_each_thread(signal, thread) { @@ -2917,15 +2948,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