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_DIRENT
|
||||||
AC_HEADER_STDC
|
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.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
|
|
20
os/osinit.c
20
os/osinit.c
|
@ -56,6 +56,9 @@ SOFTWARE.
|
||||||
#include <X11/Xos.h>
|
#include <X11/Xos.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#ifdef HAVE_DLFCN_H
|
||||||
|
# include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "dixstruct.h"
|
#include "dixstruct.h"
|
||||||
|
|
||||||
|
@ -113,6 +116,14 @@ OsSigHandler(int signo, siginfo_t *sip, void *unused)
|
||||||
OsSigHandler(int signo)
|
OsSigHandler(int signo)
|
||||||
#endif
|
#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 != NULL) {
|
||||||
if (OsSigWrapper(signo) == 0) {
|
if (OsSigWrapper(signo) == 0) {
|
||||||
/* ddx handled signal and wants us to continue */
|
/* 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__)
|
#if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__)
|
||||||
fclose(stdin);
|
fclose(stdin);
|
||||||
fclose(stdout);
|
fclose(stdout);
|
||||||
|
|
Loading…
Reference in New Issue