open-src/xserver/xorg/catch-dlerrors.patch
author Alan Coopersmith <Alan.Coopersmith@Sun.COM>
Wed, 24 Jun 2009 17:46:23 -0700
changeset 733 15c28bfd12ed
parent 705 24ca414edbff
permissions -rw-r--r--
6854717 Add man pages to document replacements for EOF programs

# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
# Use subject to license terms.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, and/or sell copies of the Software, and to permit persons
# to whom the Software is furnished to do so, provided that the above
# copyright notice(s) and this permission notice appear in all copies of
# the Software and that both the above copyright notice(s) and this
# permission notice appear in supporting documentation.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
# OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
# INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# 
# Except as contained in this notice, the name of a copyright holder
# shall not be used in advertising or otherwise to promote the sale, use
# or other dealings in this Software without prior written authorization
# of the copyright holder.

6813925 Xorg needs to catch ld.so.1 failure so it can close down devices cleanly

Catch errors loading libraries at runtime so we can clean up when a lazyloaded
library fails to open correctly.

diff -urp -x '*~' -x '*.orig' configure.ac configure.ac
--- configure.ac	2009-05-08 17:42:50.197784000 -0700
+++ configure.ac	2009-05-08 17:42:58.915352000 -0700
@@ -101,7 +101,7 @@ AM_CONDITIONAL(XSERVER_DTRACE, [test "x$
 
 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 -urp -x '*~' -x '*.orig' os/osinit.c os/osinit.c
--- os/osinit.c	2009-04-14 10:14:57.000000000 -0700
+++ os/osinit.c	2009-05-08 17:42:58.916721000 -0700
@@ -54,6 +54,10 @@ SOFTWARE.
 #include "os.h"
 #include "osdep.h"
 #include <X11/Xos.h>
+#ifdef HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+#include <signal.h>
 
 #include "dixstruct.h"
 
@@ -88,6 +92,17 @@ int limitStackSpace = -1;
 int limitNoFile = -1;
 #endif
 
+static void OsSigHandler(int signo)
+{
+    const char *dlerr = dlerror();
+
+    if (dlerr) {
+	LogMessage(X_ERROR, "Dynamic loader error: %s\n", dlerr);
+    }
+    xorg_backtrace();
+    FatalError("Caught signal %d.  Server aborting\n", signo);
+}
+
 void
 OsInit(void)
 {
@@ -96,6 +111,16 @@ OsInit(void)
     static char* devnull = "/dev/null";
     char fname[PATH_MAX];
 
+#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;
+    OsSignal(failure_signal, OsSigHandler);
+    dlinfo(RTLD_SELF, RTLD_DI_SETSIGNAL, &failure_signal);
+#endif
+
 #ifdef macII
     set42sig();
 #endif