On 11/24/2012 06:02 PM, Michael Meeks wrote:
> Sorry to bother you; just visiting some friends at Munich hosting a
> hack-fest; and they have an interesting problem with OpenJDK. It -seems-
> that even though we initialise X with XInitThreads - before Java gets
> involved and all has worked well for a long time; that (as of recently)
> we fight over the (apparently global?) XSetErrorHandler and that causes
> a nice crash :-)
>
> #0 JNU_CallStaticMethodByName (env=0x0, hasException=0x0,
> class_name=0x7a3fa571 "sun/awt/X11/XToolkit", name=0x7a3fa55e
> "globalErrorHandler", signature=0x7a3fa558 "(JJ)I")
> at ../../../src/share/native/common/jni_util.c:209
> #1 0x7a3ca216 in ToolkitErrorHandler (dpy=0x808b1b0, event=0xbfff835c) at
> ../../../src/solaris/native/sun/xawt/XlibWrapper.c:1115
> #2 0x440c8acb in _XError (dpy=0x808b1b0, rep=0xab53cc0) at
> ../../src/XlibInt.c:1583
> #3 0x440c589d in handle_error (dpy=0x808b1b0, err=0xab53cc0, in_XReply=0) at
> ../../src/xcb_io.c:212
> #4 0x440c58f7 in handle_response (dpy=0x808b1b0, response=0xab53cc0,
> in_XReply=0) at ../../src/xcb_io.c:324
> #5 0x440c63e8 in _XEventsQueued (dpy=0x808b1b0, mode=1) at
> ../../src/xcb_io.c:363
> #6 0x440b7118 in XEventsQueued (dpy=0x808b1b0, mode=1) at
> ../../src/Pending.c:43
> #7 0x47dace8f in DisplayQueue (fd=14, pDisplay=0x81b50c8) at
> /home/limux/core/vcl/unx/generic/app/saldisp.cxx:407
> #8 0x47daa521 in YieldEntry::IsEventQueued (this=0x47e9b250) at
> /home/limux/core/vcl/unx/generic/app/saldata.cxx:593
> #9 0x47da9e18 in SalXLib::Yield (this=0x8060c60, bWait=true,
> bHandleAllCurrentEvents=false) at
> /home/limux/core/vcl/unx/generic/app/saldata.cxx:775
> #10 0x464cb7dc in KDEXLib::Yield (this=0x8060c58, bWait=true,
> bHandleAllCurrentEvents=false) at
> /home/limux/core/vcl/unx/kde4/KDEXLib.cxx:293
> #11 0x47dbd7f5 in X11SalInstance::Yield (this=0x804f780, bWait=true,
> bHandleAllCurrentEvents=false) at
> /home/limux/core/vcl/unx/generic/app/salinst.cxx:164
> #12 0x428fe2fa in ImplYield (i_bWait=true, i_bAllEvents=false) at
> /home/limux/core/vcl/source/app/svapp.cxx:425
> #13 0x428fa8fe in Application::Yield (i_bAllEvents=false) at
> /home/limux/core/vcl/source/app/svapp.cxx:459
> #14 0x428fa898 in Application::Execute () at
> /home/limux/core/vcl/source/app/svapp.cxx:404
> #15 0x4010d1f7 in desktop::Desktop::Main (this=0xbfff8ab8) at
> /home/limux/core/desktop/source/app/app.cxx:1713
> #16 0x42905baf in ImplSVMain () at
> /home/limux/core/vcl/source/app/svmain.cxx:162
> #17 0x42905ccd in SVMain () at /home/limux/core/vcl/source/app/svmain.cxx:199
> #18 0x4014ef9e in soffice_main () at
> /home/limux/core/desktop/source/app/sofficemain.cxx:83
> #19 0x0804873c in sal_main () at /home/limux/core/desktop/source/app/main.c:48
> #20 0x08048713 in main (argc=5, argv=0xbfff8bf4) at
> /home/limux/core/desktop/source/app/main.c:47
>
> It seems to me that X's global error handler is the primary design
> drop-off here; there should be one per display (?). Having said that - I
> wonder if there is some nice way we can clobber Java's XError handler
> entirely, and/or stop it mis-behaving ?
Fixed thusly, We'll see what the AWT devs say.
Andrew.
--- Begin Message ---
This one was reported by the LibreOffice folks.
We don't check the return argument of JNU_GetEnv() in ToolkitErrorHandler:
static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
if (jvm != NULL) {
JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit",
"globalErrorHandler", "(JJ)I",
ptr_to_jlong(dpy),
ptr_to_jlong(event)).i;
} else {
return 0;
}
}
JNU_GetEnv() will return NULL if this thread is not a Java thread, so
we crash. This will happen if SWT is loaded in an application that
uses X itself in some threads.
The patch is pretty trivial, we just have to check env before using it:
--- jdk/src/solaris/native/sun/xawt/XlibWrapper.c~ 2012-10-11
17:20:54.000000000 +0100
+++ jdk/src/solaris/native/sun/xawt/XlibWrapper.c 2012-11-30
10:52:19.980613972 +0000
@@ -1260,13 +1260,15 @@
JavaVM* jvm = NULL;
static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
+ JNIEnv * env;
if (jvm != NULL) {
- JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit",
"globalErrorHandler", "(JJ)I",
- ptr_to_jlong(dpy),
ptr_to_jlong(event)).i;
- } else {
- return 0;
+ env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ if (env) {
+ return JNU_CallStaticMethodByName(env, NULL,
"sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I",
+ ptr_to_jlong(dpy),
ptr_to_jlong(event)).i;
+ }
}
+ return 0;
}
/*
Andrew.
--- End Message ---
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice