summaryrefslogtreecommitdiff
path: root/arch/s390
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2021-10-20 20:43:57 +0300
committerEric W. Biederman <ebiederm@xmission.com>2021-10-29 22:31:05 +0300
commit9bc508cf0791c8e5a37696de1a046d746fcbd9d8 (patch)
tree3695bcf3cde78a1b505f82397882af1e8d70f357 /arch/s390
parent1fbd60df8a852d9c55de8cd3621899cf4c72a5b7 (diff)
downloadlinux-9bc508cf0791c8e5a37696de1a046d746fcbd9d8.tar.xz
signal/s390: Use force_sigsegv in default_trap_handler
Reading the history it is unclear why default_trap_handler calls do_exit. It is not even menthioned in the commit where the change happened. My best guess is that because it is unknown why the exception happened it was desired to guarantee the process never returned to userspace. Using do_exit(SIGSEGV) has the problem that it will only terminate one thread of a process, leaving the process in an undefined state. Use force_sigsegv(SIGSEGV) instead which effectively has the same behavior except that is uses the ordinary signal mechanism and terminates all threads of a process and is generally well defined. Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Christian Borntraeger <borntraeger@de.ibm.com> Cc: linux-s390@vger.kernel.org Fixes: ca2ab03237ec ("[PATCH] s390: core changes") History Tree: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Link: https://lkml.kernel.org/r/20211020174406.17889-11-ebiederm@xmission.com Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kernel/traps.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
index bcefc2173de4..51729ea2cf8e 100644
--- a/arch/s390/kernel/traps.c
+++ b/arch/s390/kernel/traps.c
@@ -84,7 +84,7 @@ static void default_trap_handler(struct pt_regs *regs)
{
if (user_mode(regs)) {
report_user_fault(regs, SIGSEGV, 0);
- do_exit(SIGSEGV);
+ force_sigsegv(SIGSEGV);
} else
die(regs, "Unknown program exception");
}