Use RTLD_DI_SETSIGNAL to catch runtime dynamic loader errors and clean up

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@sun.com>
This commit is contained in:
Alan Coopersmith 2009-03-26 23:04:24 -07:00
parent a0b6a363dc
commit 98f4179156
2 changed files with 21 additions and 1 deletions

View File

@ -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

View File

@ -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);