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

Reply via email to