open-src/xserver/xorg/catch-dlerrors.patch
changeset 660 457a0e9b07d7
child 705 24ca414edbff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/open-src/xserver/xorg/catch-dlerrors.patch	Thu Mar 05 16:15:11 2009 -0800
@@ -0,0 +1,79 @@
+# 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.
+
+--- os/osinit.c	2008-11-05 08:52:17.000000000 -0800
++++ os/osinit.c	2009-03-05 14:44:17.792553000 -0800
+@@ -54,6 +54,8 @@
+ #include "os.h"
+ #include "osdep.h"
+ #include <X11/Xos.h>
++#include <dlfcn.h>
++#include <signal.h>
+ 
+ #ifdef SMART_SCHEDULE
+ #include "dixstruct.h"
+@@ -92,6 +94,17 @@
+ 
+ Bool OsDelayInitColors = FALSE;
+ 
++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)
+ {
+@@ -100,6 +113,16 @@
+     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