Diff between 98c97bd63f199fa1209429b5dd01692f41058d81 and 4959c6d454769f4e5d89a3432348d637ac4009f9

Changed Files

File Additions Deletions Status
src/backtrace.c +17 -2 modified
src/backtrace.h +1 -0 modified
src/main.c +3 -0 modified

Full Patch

diff --git a/src/backtrace.c b/src/backtrace.c
index 938025b..0526496 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -28,15 +28,30 @@
 #include <unistd.h>
 #include <inttypes.h>
 
+#ifdef HAVE_BACKTRACE_SUPPORT
+#include <execinfo.h>
+#include <elfutils/libdwfl.h>
+#endif
+
 #include "src/log.h"
 #include "src/backtrace.h"
 
+void btd_backtrace_init(void)
+{
 #ifdef HAVE_BACKTRACE_SUPPORT
-#include <execinfo.h>
-#include <elfutils/libdwfl.h>
+	void *frames[1];
+
+	/*
+	 * initialize the backtracer, since the ctor calls dlopen(), which
+	 * calls malloc(), which isn't signal-safe.
+	 */
+	backtrace(frames, 1);
+#endif
+}
 
 void btd_backtrace(uint16_t index)
 {
+#ifdef HAVE_BACKTRACE_SUPPORT
 	char *debuginfo_path = NULL;
 	const Dwfl_Callbacks callbacks = {
 		.find_debuginfo = dwfl_standard_find_debuginfo,
diff --git a/src/backtrace.h b/src/backtrace.h
index 654d67d..b3eef6d 100644
--- a/src/backtrace.h
+++ b/src/backtrace.h
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 
+void btd_backtrace_init(void);
 void btd_backtrace(uint16_t index);
 
 void btd_assertion_message_expr(const char *file, int line,
diff --git a/src/main.c b/src/main.c
index 9124dc5..2001cee 100644
--- a/src/main.c
+++ b/src/main.c
@@ -48,6 +48,7 @@
 #include "gdbus/gdbus.h"
 
 #include "log.h"
+#include "backtrace.h"
 
 #include "lib/uuid.h"
 #include "hcid.h"
@@ -585,6 +586,8 @@ int main(int argc, char *argv[])
 
 	umask(0077);
 
+	btd_backtrace_init();
+
 	event_loop = g_main_loop_new(NULL, FALSE);
 
 	signal = setup_signalfd();