signal/x86: In emulate_vsyscall force a signal instead of calling do_exit
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 20 Oct 2021 17:44:03 +0000 (12:44 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Nov 2021 08:49:06 +0000 (09:49 +0100)
commit 695dd0d634df8903e5ead8aa08d326f63b23368a upstream.

Directly calling do_exit with a signal number has the problem that
all of the side effects of the signal don't happen, such as
killing all of the threads of a process instead of just the
calling thread.

So replace do_exit(SIGSYS) with force_fatal_sig(SIGSYS) which
causes the signal handling to take it's normal path and work
as expected.

Cc: Andy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20211020174406.17889-17-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Thomas Backlund <tmb@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/entry/vsyscall/vsyscall_64.c

index 1b40b92..0b6b277 100644 (file)
@@ -226,7 +226,8 @@ bool emulate_vsyscall(unsigned long error_code,
        if ((!tmp && regs->orig_ax != syscall_nr) || regs->ip != address) {
                warn_bad_vsyscall(KERN_DEBUG, regs,
                                  "seccomp tried to change syscall nr or ip");
-               do_exit(SIGSYS);
+               force_fatal_sig(SIGSYS);
+               return true;
        }
        regs->orig_ax = -1;
        if (tmp)