xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Thu Aug 20 12:44:16 PDT 2009


 os/osinit.c |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

New commits:
commit 0b131a5cd91cea54240777c66a9cd385029e8cb2
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Aug 20 15:28:57 2009 -0400

    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.

diff --git a/os/osinit.c b/os/osinit.c
index 17a2bed..e8fcd45 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -59,6 +59,10 @@ SOFTWARE.
 #ifdef HAVE_DLFCN_H
 # include <dlfcn.h>
 #endif
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+#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


More information about the xorg-commit mailing list