diff --git a/toolkit/xre/nsX11ErrorHandler.cpp b/toolkit/xre/nsX11ErrorHandler.cpp index 4bfd81d5c9f2..ee806d2eee66 100644 --- a/toolkit/xre/nsX11ErrorHandler.cpp +++ b/toolkit/xre/nsX11ErrorHandler.cpp @@ -54,24 +54,15 @@ using mozilla::plugins::PluginProcessChild; #define BUFSIZE 2048 // What Xlib uses with XGetErrorDatabaseText extern "C" { -static int -IgnoreError(Display *display, XErrorEvent *event) { - return 0; // This return value is ignored. -} - static int X11Error(Display *display, XErrorEvent *event) { nsCAutoString notes; char buffer[BUFSIZE]; // Get an indication of how long ago the request that caused the error was - // made. Do this before querying extensions etc below. + // made. unsigned long age = NextRequest(display) - event->serial; - // Ignore subsequent errors, which may get processed during the extension - // queries below for example. - XSetErrorHandler(IgnoreError); - // Get a string to represent the request that caused the error. nsCAutoString message; if (event->request_code < 128) { @@ -79,22 +70,33 @@ X11Error(Display *display, XErrorEvent *event) { message.AppendInt(event->request_code); } else { // Extension request - int nExts; - char** extNames = XListExtensions(display, &nExts); - if (extNames) { - for (int i = 0; i < nExts; ++i) { - int major_opcode, first_event, first_error; - if (XQueryExtension(display, extNames[i], - &major_opcode, &first_event, &first_error) - && major_opcode == event->request_code) { - message.Append(extNames[i]); - message.Append('.'); - message.AppendInt(event->minor_code); - break; - } - } - XFreeExtensionList(extNames); + // man XSetErrorHandler says "the error handler should not call any + // functions (directly or indirectly) on the display that will generate + // protocol requests or that will look for input events" so we use another + // temporary Display to request extension information. This assumes on + // the DISPLAY environment variable has been set and matches what was used + // to open |display|. + Display *tmpDisplay = XOpenDisplay(NULL); + if (tmpDisplay) { + int nExts; + char** extNames = XListExtensions(tmpDisplay, &nExts); + if (extNames) { + for (int i = 0; i < nExts; ++i) { + int major_opcode, first_event, first_error; + if (XQueryExtension(tmpDisplay, extNames[i], + &major_opcode, &first_event, &first_error) + && major_opcode == event->request_code) { + message.Append(extNames[i]); + message.Append('.'); + message.AppendInt(event->minor_code); + break; + } + } + + XFreeExtensionList(extNames); + } + XCloseDisplay(tmpDisplay); } }