diff options
| author | Oleg Nesterov <oleg@redhat.com> | 2026-03-17 14:58:18 +0100 |
|---|---|---|
| committer | Andrew Morton <akpm@linux-foundation.org> | 2026-03-27 21:19:48 -0700 |
| commit | 0f8e38eeb995bf818a7f220de109d6b6b96038b4 (patch) | |
| tree | 1cb54b74dee79dbf857d815750e0375307d20f6c /kernel | |
| parent | 4580900fe184dcb2a4e32e28951a3aa0726dc48b (diff) | |
| download | lwn-0f8e38eeb995bf818a7f220de109d6b6b96038b4.tar.gz lwn-0f8e38eeb995bf818a7f220de109d6b6b96038b4.zip | |
do_notify_parent: sanitize the valid_signal() checks
Now that kernel_clone() checks valid_signal(args->exit_signal), the "sig"
argument of do_notify_parent() must always be valid or we have a bug.
However, do_notify_parent() only checks that sig != -1 at the start, then
it does another valid_signal() check before __send_signal_locked().
This is confusing. Change do_notify_parent() to WARN and return early if
valid_signal(sig) is false.
Link: https://lkml.kernel.org/r/abld-ilvMEZ7VgMw@redhat.com
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Deepanshu Kartikey <Kartikey406@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/signal.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 86aad7badb9a..683ef92f7234 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2171,7 +2171,8 @@ bool do_notify_parent(struct task_struct *tsk, int sig) bool autoreap = false; u64 utime, stime; - WARN_ON_ONCE(sig == -1); + if (WARN_ON_ONCE(!valid_signal(sig))) + return false; /* do_notify_parent_cldstop should have been called instead. */ WARN_ON_ONCE(task_is_stopped_or_traced(tsk)); @@ -2252,7 +2253,7 @@ bool do_notify_parent(struct task_struct *tsk, int sig) * Send with __send_signal as si_pid and si_uid are in the * parent's namespaces. */ - if (valid_signal(sig) && sig) + if (sig) __send_signal_locked(sig, &info, tsk->parent, PIDTYPE_TGID, false); __wake_up_parent(tsk, tsk->parent); spin_unlock_irqrestore(&psig->siglock, flags); |
