[PATCH] Use RTLD_DI_SETSIGNAL to catch runtime dynamic loader errors and clean up
Alan Coopersmith
alan.coopersmith at sun.com
Tue Mar 31 11:23:27 PDT 2009
Based on fix for Sun bug 6813925: Xorg needs to catch ld.so.1 failure
so it can close down devices cleanly
<http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6813925>
Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>
---
configure.ac | 2 +-
os/osinit.c | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/configure.ac b/configure.ac
index f4e1dbb..93ef0bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -105,7 +105,7 @@ AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"])
AC_HEADER_DIRENT
AC_HEADER_STDC
-AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h])
+AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h])
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
diff --git a/os/osinit.c b/os/osinit.c
index 34d8378..b7bd076 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -56,6 +56,9 @@ SOFTWARE.
#include <X11/Xos.h>
#include <signal.h>
#include <errno.h>
+#ifdef HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
#include "dixstruct.h"
@@ -113,6 +116,14 @@ OsSigHandler(int signo, siginfo_t *sip, void *unused)
OsSigHandler(int signo)
#endif
{
+#ifdef RTLD_DI_SETSIGNAL
+ const char *dlerr = dlerror();
+
+ if (dlerr) {
+ LogMessage(X_ERROR, "Dynamic loader error: %s\n", dlerr);
+ }
+#endif /* RTLD_DI_SETSIGNAL */
+
if (OsSigWrapper != NULL) {
if (OsSigWrapper(signo) == 0) {
/* ddx handled signal and wants us to continue */
@@ -180,6 +191,15 @@ OsInit(void)
}
}
+#ifdef RTLD_DI_SETSIGNAL
+ /* Tell runtime linker to send a signal we can catch instead of SIGKILL
+ * for failures to load libraries/modules at runtime so we can clean up
+ * after ourselves.
+ */
+ int failure_signal = SIGQUIT;
+ dlinfo(RTLD_SELF, RTLD_DI_SETSIGNAL, &failure_signal);
+#endif
+
#if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__)
fclose(stdin);
fclose(stdout);
--
1.5.6.5
More information about the xorg-devel
mailing list