]> git.saurik.com Git - apple/libc.git/blobdiff - stdlib/FreeBSD/abort.c
Libc-1439.40.11.tar.gz
[apple/libc.git] / stdlib / FreeBSD / abort.c
index 8758cf885f34b1565bfb814760cca360a30e7744..bac55ad101c90bd200a6a6a0694578dc87ab0be7 100644 (file)
@@ -48,11 +48,16 @@ __FBSDID("$FreeBSD: src/lib/libc/stdlib/abort.c,v 1.11 2007/01/09 00:28:09 imp E
 
 #include "libc_private.h"
 
+#if __has_include(<CrashReporterClient.h>)
 #include <CrashReporterClient.h>
+#else
+#define CRGetCrashLogMessage() NULL
+#define CRSetCrashLogMessage(...)
+#endif
 #include "_simple.h"
 
 extern void (*__cleanup)();
-extern void __abort(void) __dead2;
+extern void __abort(void) __cold __dead2;
 
 #define TIMEOUT        10000   /* 10 milliseconds */
 
@@ -78,6 +83,17 @@ abort()
         */
        sigdelset(&act.sa_mask, SIGABRT);
 
+       /*
+        * Don't block SIGSEGV since we might trigger a segfault if the pthread
+        * struct is corrupt. The end user behavior is that the program will
+        * terminate with a SIGSEGV instead of a SIGABRT which is acceptable. If
+        * the user registers a SIGSEGV handler, then they are responsible for
+        * dealing with any corruption themselves and abort may not work.
+        * rdar://48853131
+        */
+       sigdelset(&act.sa_mask, SIGSEGV);
+       sigdelset(&act.sa_mask, SIGBUS);
+
        /* <rdar://problem/7397932> abort() should call pthread_kill to deliver a signal to the aborting thread 
         * This helps gdb focus on the thread calling abort()
         */