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:
parent
a0b6a363dc
commit
98f4179156
|
@ -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
|
||||
|
|
20
os/osinit.c
20
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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user