Skip to content

Commit

Permalink
android: restore the default SIGABRT handler in fatal_error()
Browse files Browse the repository at this point in the history
async_safe_fatal() calls abort() at the end, which can be intercepted by a custom SIGABRT handler.

In particular, crashlytics installs such a handler and tries to fork() after catching SIGABRT.

hardened_malloc uses pthread_atfork() to register fork handlers. These handlers try to lock internal
hardened_malloc mutexes. If at least one of those mutexes is already locked, which is usually the
case, thread that called fatai_error() gets deadlocked, while the other threads (if there are any)
continue to run.
  • Loading branch information
muhomorr committed Dec 31, 2023
1 parent 7093fdc commit 0cd5d94
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

#ifdef __ANDROID__
#include <async_safe/log.h>
int mallopt(int param, int value);
#define M_BIONIC_RESTORE_DEFAULT_SIGABRT_HANDLER (-1003)
#endif

#include "util.h"
Expand All @@ -30,6 +32,7 @@ static int write_full(int fd, const char *buf, size_t length) {

COLD noreturn void fatal_error(const char *s) {
#ifdef __ANDROID__
mallopt(M_BIONIC_RESTORE_DEFAULT_SIGABRT_HANDLER, 0);
async_safe_fatal("hardened_malloc: fatal allocator error: %s", s);
#else
const char *prefix = "fatal allocator error: ";
Expand Down

0 comments on commit 0cd5d94

Please sign in to comment.