Skip to content

Commit

Permalink
signal: Always attempt to allocate siginfo for SIGSTOP
Browse files Browse the repository at this point in the history
Since 2.5.34 the code has had the potential to not allocate siginfo
for SIGSTOP signals.  Except for ptrace this is perfectly fine as only
ptrace can use PTRACE_PEEK_SIGINFO and see what the contents of
the delivered siginfo are.

Users of PTRACE_PEEK_SIGINFO that care about the contents siginfo
for SIGSTOP are rare, but they do exist.  A seccomp self test
has cared and lldb cares.

Jack Andersen <[email protected]> writes:

> The patch titled
> `signal: Never allocate siginfo for SIGKILL or SIGSTOP`
> created a regression for users of PTRACE_GETSIGINFO needing to
> discern signals that were raised via the tgkill syscall.
>
> A notable user of this tgkill+ptrace combination is lldb while
> debugging a multithreaded program. Without the ability to detect a
> SIGSTOP originating from tgkill, lldb does not have a way to
> synchronize on a per-thread basis and falls back to SIGSTOP-ing the
> entire process.

Everyone affected by this please note.  The kernel can still fail to
allocate a siginfo structure.  The allocation is with GFP_KERNEL and
is best effort only.  If memory is tight when the signal allocation
comes in this will fail to allocate a siginfo.

So I strongly recommend looking at more robust solutions for
synchronizing with a single thread such as PTRACE_INTERRUPT.  Or if
that does not work persuading your friendly local kernel developer to
build the interface you need.

Reported-by: Tycho Andersen <[email protected]>
Reported-by: Kees Cook <[email protected]>
Reported-by: Jack Andersen <[email protected]>
Acked-by: Linus Torvalds <[email protected]>
Reviewed-by: Christian Brauner <[email protected]>
Cc: [email protected]
Fixes: f149b31 ("signal: Never allocate siginfo for SIGKILL or SIGSTOP")
Fixes: 6dfc889 ("[PATCH] shared thread signals")
History Tree: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
Signed-off-by: "Eric W. Biederman" <[email protected]>
  • Loading branch information
ebiederm committed Feb 5, 2019
1 parent ee17e5d commit a692933
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1057,10 +1057,9 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc

result = TRACE_SIGNAL_DELIVERED;
/*
* Skip useless siginfo allocation for SIGKILL SIGSTOP,
* and kernel threads.
* Skip useless siginfo allocation for SIGKILL and kernel threads.
*/
if (sig_kernel_only(sig) || (t->flags & PF_KTHREAD))
if ((sig == SIGKILL) || (t->flags & PF_KTHREAD))
goto out_set;

/*
Expand Down

0 comments on commit a692933

Please sign in to comment.