eclipse-openj9 / openj9

Eclipse OpenJ9: A Java Virtual Machine for OpenJDK that's optimized for small footprint, fast start-up, and high throughput. Builds on Eclipse OMR (https://github.com/eclipse/omr) and combines with the Extensions for OpenJDK for OpenJ9 repo.
Other
3.27k stars 721 forks source link

OpenJ9-17 report BUG! UNCAUGHT EXCEPTION, but 8 and 11 are not reported. #18608

Closed TheSail28 closed 9 months ago

TheSail28 commented 9 months ago

Affected versions

We found a test case with execution problems. To facilitate analysis, we simplified the test case and the simplified class file can ben found at attachment.

Java -version output

openjdk version "1.8.0_382"
IBM Semeru Runtime Open Edition (build 1.8.0_382-b05)
Eclipse OpenJ9 VM (build openj9-0.40.0, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20230810_729 (JIT enabled, AOT enabled)
OpenJ9   - d12d10c9e
OMR      - e80bff83b
JCL      - c4d2c2bafb based on jdk8u382-b05)
openjdk version "11.0.20.1" 2023-08-24
IBM Semeru Runtime Open Edition 11.0.20.1 (build 11.0.20.1+1)
Eclipse OpenJ9 VM 11.0.20.1 (build openj9-0.40.0, JRE 11 Linux amd64-64-Bit Compressed References 20230824_836 (JIT enabled, AOT enabled)
OpenJ9   - d12d10c9e
OMR      - e80bff83b
JCL      - 0880e8df04 based on jdk-11.0.20.1+1)
openjdk version "17.0.8.1" 2023-08-24
IBM Semeru Runtime Open Edition 17.0.8.1 (build 17.0.8.1+1)
Eclipse OpenJ9 VM 17.0.8.1 (build openj9-0.40.0, JRE 17 Linux amd64-64-Bit Compressed References 20230824_549 (JIT enabled, AOT enabled)
OpenJ9   - d12d10c9e
OMR      - e80bff83b
JCL      - 8ecf238a124 based on jdk-17.0.8.1+1)

Reproduce

jdk_linux_8_openj9/bin/java -cp ./lib/groovy-all-2.3.9.jar:./ ysoserial.payloads.Groovy1

jdk_linux_11_openj9/bin/java -cp ./lib/groovy-all-2.3.9.jar:./ ysoserial.payloads.Groovy1

jdk_linux_17_openj9/bin/java -cp ./lib/groovy-all-2.3.9.jar:./ ysoserial.payloads.Groovy1

Expected Result

---------------jdk_linux_8_openj9---------------
nothing
---------------jdk_linux_11_openj9---------------
nothing
---------------jdk_linux_17_openj9---------------
nothing

Actual Result

---------------jdk_linux_8_openj9---------------
nothing
---------------jdk_linux_11_openj9---------------
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass$3$1 to method java.lang.Object.finalize()
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass$3$1 to method java.lang.Object.clone()
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass$3$1 to method java.lang.Object.registerNatives()
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
---------------jdk_linux_17_openj9---------------
Exception in thread "main" BUG! UNCAUGHT EXCEPTION: java.lang.invoke.MethodHandles$Lookup.<init>(java.lang.Class,int)
    at org.codehaus.groovy.vmplugin.v7.Java7.<clinit>(Java7.java:44)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source)
    at java.base/java.lang.reflect.ReflectAccess.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(Unknown Source)
    at java.base/java.lang.Class.newInstance(Unknown Source)
    at org.codehaus.groovy.vmplugin.VMPluginFactory.createPlugin(VMPluginFactory.java:56)
    at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:37)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:99)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:71)
    at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:33)
    at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:61)
    at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)
    at groovy.lang.Closure.<init>(Closure.java:219)
    at groovy.lang.Closure.<init>(Closure.java:236)
    at groovy.lang.Closure$1.<init>(Closure.java:203)
    at groovy.lang.Closure.<clinit>(Closure.java:203)
    at ysoserial.payloads.Groovy1.getObject(Unknown Source)
    at ysoserial.payloads.Groovy1.getObject(Unknown Source)
    at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
    at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
    at ysoserial.ExecBlockingSecurityManager.wrap(Unknown Source)
    at ysoserial.payloads.util.PayloadRunner.run(Unknown Source)
    at ysoserial.payloads.Groovy1.main(Unknown Source)
Caused by: java.lang.NoSuchMethodException: java.lang.invoke.MethodHandles$Lookup.<init>(java.lang.Class,int)
    at java.base/java.lang.Class.getConstructor0(Unknown Source)
    at java.base/java.lang.Class.getDeclaredConstructor(Unknown Source)
    at org.codehaus.groovy.vmplugin.v7.Java7.<clinit>(Java7.java:42)
    ... 25 more

Problem summary

ysoserial.payloads.Groovy1 calls the getObject() method of the class through a series of passes, where OpenJ9-8 reports nothing, OpenJ9-11 reports some WARNING, and OpenJ9-17 throws a exception.

Attachment

testcase1.zip

pshipton commented 9 months ago

Hotspot has the same behavior.

java.lang.reflect.InaccessibleObjectException: Unable to make protected void java.lang.Object.finalize() throws java.lang.Throwable accessible: module java.base does not "opens java.lang" to unnamed module @2c4d0347
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
        at java.base/java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:130)
        at org.codehaus.groovy.reflection.CachedClass$3$1.run(CachedClass.java:86)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:81)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79)
        at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
        at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
        at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:250)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:116)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79)
        at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
        at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
        at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:250)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:116)
        at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79)
        at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
        at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
        at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:250)
        at org.codehaus.groovy.reflection.stdclasses.CachedClosureClass.<init>(CachedClosureClass.java:29)
        at org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:312)
        at org.codehaus.groovy.reflection.ClassInfo.access$400(ClassInfo.java:37)
        at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:484)
        at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:475)
        at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
        at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
        at org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:94)
        at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:107)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:189)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:93)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:71)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:33)
        at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:61)
        at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)
        at groovy.lang.Closure.<init>(Closure.java:219)
        at groovy.lang.Closure.<init>(Closure.java:236)
        at groovy.lang.Closure$1.<init>(Closure.java:203)
        at groovy.lang.Closure.<clinit>(Closure.java:203)
        at ysoserial.payloads.Groovy1.getObject(Unknown Source)
        at ysoserial.payloads.Groovy1.getObject(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
        at ysoserial.ExecBlockingSecurityManager.wrap(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner.run(Unknown Source)
        at ysoserial.payloads.Groovy1.main(Unknown Source)
Exception in thread "main" BUG! UNCAUGHT EXCEPTION: java.lang.invoke.MethodHandles$Lookup.<init>(java.lang.Class,int)
        at org.codehaus.groovy.vmplugin.v7.Java7.<clinit>(Java7.java:44)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
        at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
        at java.base/java.lang.Class.newInstance(Class.java:645)
        at org.codehaus.groovy.vmplugin.VMPluginFactory.createPlugin(VMPluginFactory.java:56)
        at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:37)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:99)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:71)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:33)
        at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:61)
        at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)
        at groovy.lang.Closure.<init>(Closure.java:219)
        at groovy.lang.Closure.<init>(Closure.java:236)
        at groovy.lang.Closure$1.<init>(Closure.java:203)
        at groovy.lang.Closure.<clinit>(Closure.java:203)
        at ysoserial.payloads.Groovy1.getObject(Unknown Source)
        at ysoserial.payloads.Groovy1.getObject(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner$1.call(Unknown Source)
        at ysoserial.ExecBlockingSecurityManager.wrap(Unknown Source)
        at ysoserial.payloads.util.PayloadRunner.run(Unknown Source)
        at ysoserial.payloads.Groovy1.main(Unknown Source)
Caused by: java.lang.NoSuchMethodException: java.lang.invoke.MethodHandles$Lookup.<init>(java.lang.Class,int)
        at java.base/java.lang.Class.getConstructor0(Class.java:3585)
        at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
        at org.codehaus.groovy.vmplugin.v7.Java7.<clinit>(Java7.java:42)
        ... 25 more
pshipton commented 9 months ago

The behavior comes from OpenJDK and you should peruse it with the OpenJDK project.