diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2018-07-19 20:33:53 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2018-09-11 21:18:45 +0200 |
commit | 55a3235fc71bf34303e34a95eeee235b2d2a35dd (patch) | |
tree | da1f29b973509ac7e2e0b6851eb7aa6fe5e45405 /kernel | |
parent | 86989c41b5ea08776c450cb759592532314a4ed6 (diff) | |
download | linux-stable-55a3235fc71bf34303e34a95eeee235b2d2a35dd.tar.gz linux-stable-55a3235fc71bf34303e34a95eeee235b2d2a35dd.tar.bz2 linux-stable-55a3235fc71bf34303e34a95eeee235b2d2a35dd.zip |
signal: Properly deliver SIGILL from uprobes
For userspace to tell the difference between a random signal and an
exception, the exception must include siginfo information.
Using SEND_SIG_FORCED for SIGILL is thus wrong, and it will result
in userspace seeing si_code == SI_USER (like a random signal) instead
of si_code == SI_KERNEL or a more specific si_code as all exceptions
deliver.
Therefore replace force_sig_info(SIGILL, SEND_SIG_FORCE, current)
with force_sig(SIG_ILL, current) which gets this right and is
shorter and easier to type.
Fixes: 014940bad8e4 ("uprobes/x86: Send SIGILL if arch_uprobe_post_xol() fails")
Fixes: 0b5256c7f173 ("uprobes: Send SIGILL if handle_trampoline() fails")
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/uprobes.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 3207a4d26849..2bf792d22087 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1858,7 +1858,7 @@ static void handle_trampoline(struct pt_regs *regs) sigill: uprobe_warn(current, "handle uretprobe, sending SIGILL."); - force_sig_info(SIGILL, SEND_SIG_FORCED, current); + force_sig(SIGILL, current); } @@ -1966,7 +1966,7 @@ static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs) if (unlikely(err)) { uprobe_warn(current, "execute the probed insn, sending SIGILL."); - force_sig_info(SIGILL, SEND_SIG_FORCED, current); + force_sig(SIGILL, current); } } |