diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2018-04-18 03:54:24 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2018-04-18 03:54:24 -0500 |
commit | 752c72a485371af594aa449521439c70e60ecf75 (patch) | |
tree | d898b674b1d434cde2dbbc8a8141b4dc8ab87d22 /system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch | |
parent | 1b9fbd9e522f06d229a6016e4d045ac0de946266 (diff) | |
download | packages-752c72a485371af594aa449521439c70e60ecf75.tar.gz packages-752c72a485371af594aa449521439c70e60ecf75.tar.bz2 packages-752c72a485371af594aa449521439c70e60ecf75.tar.xz packages-752c72a485371af594aa449521439c70e60ecf75.zip |
system/musl: more POSIX
Diffstat (limited to 'system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch')
-rw-r--r-- | system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch b/system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch new file mode 100644 index 000000000..4ab303c7d --- /dev/null +++ b/system/musl/0007-abort-raise-SIGABRT-again-if-signal-is-ignored.patch @@ -0,0 +1,55 @@ +From 1316aae0c862240ff58b1cf38c92cd8cefd02a91 Mon Sep 17 00:00:00 2001 +From: "A. Wilcox" <AWilcox@Wilcox-Tech.com> +Date: Tue, 17 Apr 2018 22:08:48 -0500 +Subject: [PATCH 7/7] abort: raise SIGABRT again if signal is ignored + +POSIX requires that abort() gives the SIGABRT status to waitpid(3) and +friends. If a signal handler is installed, and erroneously returns, +then the status given to waitpid(3) is SIGSEGV instead of SIGABRT. + +This change gives another opportunity for the proper SIGABRT status to +be given to any process monitoring this one's process, before we fall +back to a_crash(), which should be sufficient. +--- + src/exit/abort.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/src/exit/abort.c b/src/exit/abort.c +index ecc0f735..5e5a87c3 100644 +--- a/src/exit/abort.c ++++ b/src/exit/abort.c +@@ -1,13 +1,31 @@ + #include <stdlib.h> + #include <signal.h> ++#include <string.h> + #include "syscall.h" + #include "pthread_impl.h" + #include "atomic.h" + + _Noreturn void abort(void) + { ++ struct sigaction abrtaction; ++ sigset_t abrtset; ++ + raise(SIGABRT); + __block_all_sigs(0); ++ ++ /* Unblock just SIGABRT, and set default handler */ ++ sigemptyset(&abrtset); ++ sigaddset(&abrtset, SIGABRT); ++ sigprocmask(SIG_UNBLOCK, &abrtset, 0); ++ ++ memset(&abrtaction, 0, sizeof(struct sigaction)); ++ abrtaction.sa_handler = SIG_DFL; ++ ++ sigaction(SIGABRT, &abrtaction, NULL); ++ ++ raise(SIGABRT); ++ ++ /* Ok, give up. */ + a_crash(); + raise(SIGKILL); + _Exit(127); +-- +2.15.0 + |