Loading...
--- Libc/Libc-1725.40.4/stdlib/FreeBSD/abort.c
+++ Libc/Libc-825.26/stdlib/FreeBSD/abort.c
@@ -27,9 +27,6 @@
* SUCH DAMAGE.
*/
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wstrict-prototypes"
-
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)abort.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
@@ -43,21 +40,15 @@
#include <stddef.h>
#include <unistd.h>
#include <pthread.h>
-#include <pthread_workqueue.h>
#include "un-namespace.h"
#include "libc_private.h"
-#include "stdio/FreeBSD/local.h" // for __cleanup
-#if __has_include(<CrashReporterClient.h>)
-#include <CrashReporterClient.h>
-#else
-#define CRGetCrashLogMessage() NULL
-#define CRSetCrashLogMessage(...)
-#endif
+#include "CrashReporterClient.h"
#include "_simple.h"
-extern void __abort(void) __cold __dead2;
+extern void (*__cleanup)();
+extern void __abort(void) __dead2;
#define TIMEOUT 10000 /* 10 milliseconds */
@@ -70,23 +61,11 @@
CRSetCrashLogMessage("abort() called");
/*
- * Fetch pthread_self() now, before we start masking signals.
- * pthread_self will abort or crash if the pthread's signature
- * appears corrupt. aborting inside abort is painful, so let's get
- * that out of the way before we go any further.
- */
- pthread_t self = pthread_self();
-
- /*
* POSIX requires we flush stdio buffers on abort.
* XXX ISO C requires that abort() be async-signal-safe.
*/
if (__cleanup)
-#ifdef __APPLE__
- _cleanup();
-#else
- (*__cleanup)();
-#endif // __APPLE__
+ (*__cleanup)();
sigfillset(&act.sa_mask);
/*
@@ -95,32 +74,24 @@
*/
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()
*/
+ if (__is_threaded) {
+ /* Block all signals on all other threads */
+ sigset_t fullmask;
+ sigfillset(&fullmask);
+ (void)_sigprocmask(SIG_SETMASK, &fullmask, NULL);
- /* Block all signals on all other threads */
- sigset_t fullmask;
- sigfillset(&fullmask);
- (void)_sigprocmask(SIG_SETMASK, &fullmask, NULL);
+ /* <rdar://problem/8400096> Set the workqueue killable */
+ __pthread_workqueue_setkill(1);
- /* <rdar://problem/8400096> Set the workqueue killable */
- __pthread_workqueue_setkill(1);
-
- (void)pthread_sigmask(SIG_SETMASK, &act.sa_mask, NULL);
- (void)pthread_kill(self, SIGABRT);
-
+ (void)pthread_sigmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)pthread_kill(pthread_self(), SIGABRT);
+ } else {
+ (void)_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)kill(getpid(), SIGABRT);
+ }
usleep(TIMEOUT); /* give time for signal to happen */
/*
@@ -137,10 +108,6 @@
if (!CRGetCrashLogMessage())
CRSetCrashLogMessage("__abort() called");
-
- /* Fetch pthread_self() before masking signals - see above. */
- pthread_t self = pthread_self();
-
act.sa_handler = SIG_DFL;
act.sa_flags = 0;
sigfillset(&act.sa_mask);
@@ -150,18 +117,21 @@
/* <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()
*/
+ if (__is_threaded) {
+ /* Block all signals on all other threads */
+ sigset_t fullmask;
+ sigfillset(&fullmask);
+ (void)_sigprocmask(SIG_SETMASK, &fullmask, NULL);
- /* Block all signals on all other threads */
- sigset_t fullmask;
- sigfillset(&fullmask);
- (void)_sigprocmask(SIG_SETMASK, &fullmask, NULL);
+ /* <rdar://problem/8400096> Set the workqueue killable */
+ __pthread_workqueue_setkill(1);
- /* <rdar://problem/8400096> Set the workqueue killable */
- __pthread_workqueue_setkill(1);
-
- (void)pthread_sigmask(SIG_SETMASK, &act.sa_mask, NULL);
- (void)pthread_kill(self, SIGABRT);
-
+ (void)pthread_sigmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)pthread_kill(pthread_self(), SIGABRT);
+ } else {
+ (void)_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)kill(getpid(), SIGABRT);
+ }
usleep(TIMEOUT); /* give time for signal to happen */
/* If for some reason SIGABRT was not delivered, we exit using __builtin_trap
@@ -175,7 +145,7 @@
__builtin_trap();
}
-void
+__private_extern__ void
abort_report_np(const char *fmt, ...)
{
_SIMPLE_STRING s;
@@ -190,4 +160,3 @@
CRSetCrashLogMessage(fmt); /* the format string is better than nothing */
abort();
}
-#pragma clang diagnostic pop