From 0b131a5cd91cea54240777c66a9cd385029e8cb2 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Thu, 20 Aug 2009 15:28:57 -0400 Subject: linux: Yet more malloc() avoidance for backtrace() Turns out, there's an initializer at the top of backtrace() that (on some arches) calls dlopen(). dlopen(), unsurprisingly, calls malloc(). So, call backtrace() early in signal handler setup so we can later safely call it from the signal handler itself. --- os/osinit.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/os/osinit.c b/os/osinit.c index 17a2bedc7..e8fcd4540 100644 --- a/os/osinit.c +++ b/os/osinit.c @@ -59,6 +59,10 @@ SOFTWARE. #ifdef HAVE_DLFCN_H # include #endif +#ifdef HAVE_BACKTRACE +#include +#endif + #include "dixstruct.h" @@ -192,6 +196,16 @@ OsInit(void) siglist[i], strerror(errno)); } } +#ifdef HAVE_BACKTRACE + /* + * initialize the backtracer, since the ctor calls dlopen(), which + * calls malloc(), which isn't signal-safe. + */ + do { + void *array; + backtrace(&array, 1); + } while (0); +#endif #ifdef RTLD_DI_SETSIGNAL /* Tell runtime linker to send a signal we can catch instead of SIGKILL -- cgit v1.2.3