• Stephan Bergmann's avatar
    Avoid calling java.lang.Class.newInstance() · 27c6d1db
    Stephan Bergmann yazdı
    For one, it is deprecated since Java 9, and for another it causes a
    NullPointerException when called from the JNI Invocation API (i.e., without a
    Java caller frame) at least with some Java 12.
    
    (Found when doing a test build with Java 12 and JAVA_SOURCE/TARGET_VER
    explicitly configured as 7 with d365f363 "Allow
    to pass JAVA_SOURCE/TARGET_VER into configure".)
    
    I have entered information about the NullPointerException at
    <https://bugreport.java.com/bugreport/start_form.do>, but haven't heard back
    yet, so duplicate that information here:
    
    Issue Type:
    > Bug
    
    Component:
    > Core Libraries
    
    Operating System:
    > Linux 64-bit
    
    Java Release:
    > 12
    
    Synopsis:
    > Calling java.lang.Class.newInstance from JNI Invocation API causes NullPointerEx
    
    Description:
    > I can reproduce this with the OpenJDK 12 RPMs on Fedora 30, but from looking at <https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f/src/java.base/share/classes/java/lang/Class.java> it looks plausible that it is a common issue that Reflection.getCallerClass() returns null when java.lang.Class.newInstance is called from the JNI Invocation API, and that null is propagated to jdk.internal.reflect.Reflection.verifyMemberAccess as parameter currentClass, which dereferences it at <https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f/src/java.base/share/classes/jdk/internal/reflect/Reflection.java#l130>.
    > This is known to have been working with older OpenJDK (at least 1.8).
    
    Steps to Reproduce:
    > Compile the provided test.cc with `g++ -I/usr/lib/jvm/java-12-openjdk-12.0.0.33-1.ea.1.rolling.fc30.x86_64/include -I/usr/lib/jvm/java-12-openjdk-12.0.0.33-1.ea.1.rolling.fc30.x86_64/include/linux /usr/lib/jvm/java-12-openjdk-12.0.0.33-1.ea.1.rolling.fc30.x86_64/lib/server/libjvm.so test.cc` and run it with `LD_LIBRARY_PATH=/usr/lib/jvm/java-12-openjdk-12.0.0.33-1.ea.1.rolling.fc30.x86_64/lib/server ./a.out`.
    
    Expected Result:
    > exit 0
    
    Actual Result:
    > Exception in thread "main" java.lang.NullPointerException
    > 	at java.base/jdk.internal.reflect.Reflection.verifyMemberAccess(Reflection.java:130)
    > 	at java.base/java.lang.reflect.AccessibleObject.slowVerifyAccess(AccessibleObject.java:673)
    > 	at java.base/java.lang.reflect.AccessibleObject.verifyAccess(AccessibleObject.java:666)
    > 	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:638)
    > 	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:490)
    > 	at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:166)
    > 	at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404)
    > 	at java.base/java.lang.Class.newInstance(Class.java:590)
    > Aborted
    
    Source code for an executable test case:
    > #include <cstdlib>
    >
    > #include "jni.h"
    >
    > void handleError(JNIEnv * env) {
    >     if (env->ExceptionCheck()) {
    >         env->ExceptionDescribe();
    >         std::abort();
    >     }
    > }
    >
    > int main() {
    >     JavaVM * vm;
    >     JNIEnv * env;
    >     JavaVMInitArgs args{JNI_VERSION_1_2, 0, nullptr, true};
    >     if (JNI_CreateJavaVM(&vm, reinterpret_cast<void **>(&env), &args) != JNI_OK) {
    >         std::abort();
    >     }
    >     auto const c1 = env->FindClass("java/lang/Class");
    >     handleError(env);
    >     auto const id = env->GetMethodID(c1, "newInstance", "()Ljava/lang/Object;");
    >     handleError(env);
    >     auto const c2 = env->FindClass("java/lang/Object");
    >     handleError(env);
    >     env->CallObjectMethod(c2, id);
    >     handleError(env);
    > }
    
    Workaround:
    > Call via JNI the suggested replacement of clazz.getDeclaredConstructor().newInstance() instead of the deprecated java.lang.Class.newInstance().
    
    Change-Id: I85ff7102a18b98561f188e609873753546bc050d
    Reviewed-on: https://gerrit.libreoffice.org/71240
    Tested-by: Jenkins
    Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
    27c6d1db
Adı
Son kayıt (commit)
Son güncelleme
..
com/sun/star/sdbcx/comp/hsqldb Loading commit data...
inc Loading commit data...
org/hsqldb/lib Loading commit data...
qa Loading commit data...
registry Loading commit data...
source Loading commit data...
workben Loading commit data...
AllLangMoTarget_cnr.mk Loading commit data...
Configuration_ado.mk Loading commit data...
Configuration_calc.mk Loading commit data...
Configuration_dbase.mk Loading commit data...
Configuration_evoab.mk Loading commit data...
Configuration_firebird.mk Loading commit data...
Configuration_flat.mk Loading commit data...
Configuration_hsqldb.mk Loading commit data...
Configuration_jdbc.mk Loading commit data...
Configuration_macab.mk Loading commit data...
Configuration_mork.mk Loading commit data...
Configuration_mysql.mk Loading commit data...
Configuration_mysql_jdbc.mk Loading commit data...
Configuration_odbc.mk Loading commit data...
Configuration_postgresql.mk Loading commit data...
Configuration_writer.mk Loading commit data...
CppunitTest_connectivity_ado.mk Loading commit data...
CppunitTest_connectivity_commontools.mk Loading commit data...
CppunitTest_connectivity_mork.mk Loading commit data...
CppunitTest_connectivity_mysql_test.mk Loading commit data...
Executable_mork_helper.mk Loading commit data...
Jar_ConnectivityTools.mk Loading commit data...
Jar_sdbc_hsqldb.mk Loading commit data...
JunitTest_complex.mk Loading commit data...
Library_ado.mk Loading commit data...
Library_calc.mk Loading commit data...
Library_dbase.mk Loading commit data...
Library_dbpool2.mk Loading commit data...
Library_dbtools.mk Loading commit data...
Library_evoab.mk Loading commit data...
Library_file.mk Loading commit data...
Library_firebird_sdbc.mk Loading commit data...
Library_flat.mk Loading commit data...
Library_hsqldb.mk Loading commit data...
Library_jdbc.mk Loading commit data...
Library_macab1.mk Loading commit data...
Library_macabdrv1.mk Loading commit data...
Library_mork.mk Loading commit data...
Library_mozbootstrap.mk Loading commit data...
Library_mysql_jdbc.mk Loading commit data...
Library_mysqlc.mk Loading commit data...
Library_odbc.mk Loading commit data...
Library_postgresql-sdbc-impl.mk Loading commit data...
Library_postgresql-sdbc.mk Loading commit data...
Library_sdbc2.mk Loading commit data...
Library_writer.mk Loading commit data...
Makefile Loading commit data...
Module_connectivity.mk Loading commit data...
Package_postgresql-sdbc.mk Loading commit data...
README Loading commit data...
Rdb_postgresql-sdbc.mk Loading commit data...