[foreign] NPE when trying to lookup a symbol in the default library when no libraries are loaded
Jorn Vernee
jbvernee at xs4all.nl
Wed Sep 12 17:27:59 UTC 2018
Hello,
I ran into an NPE while running some of the tests for foreign. This is
the (much reduced) code to reproduce:
Libraries.getDefaultLibrary().lookup("");
Throwing:
Exception in thread "main" java.lang.NullPointerException
at
java.base/java.lang.ClassLoader$NativeLibrary.getFromClass(ClassLoader.java:2545)
at java.base/java.lang.ClassLoader$NativeLibrary.findEntry(Native
Method)
at
java.base/java.lang.ClassLoader$NativeLibrary.lookup(ClassLoader.java:2426)
at com.github.jdnl.Main.main(Main.java:108)
If a NativeHeader annotation does not have a value for the `libraries`
field, the default library is used for lookup (see
LibrariesHelper::getSymbolLookupForClass), so that's how I discovered
this error.
It seems that when you try to lookup a symbol in a library the findEntry
function will call JNIEnv->FindClass which calls getFromClass
(jni.cpp:403) to find the class loading the library:
ClassLoader.java:2544
// Invoked in the VM to determine the context class in JNI_OnLoad
// and JNI_OnUnload
static Class<?> getFromClass() {
return nativeLibraryContext.peek().fromClass;
}
But if no native library is loaded (i.e. when using the default
library), this context is empty, peek() returns null and you get an NPE.
I have verified that the nativeLibraryContext is empty with debugging.
If I load a library (e.g. Libraries.loadLibrary(lookup(), "msvcrt"))
before the call to lookup("") I get the expected result:
Exception in thread "main" java.lang.NoSuchMethodException: Cannot
find symbol in library <default>
at
java.base/java.lang.ClassLoader$NativeLibrary.lookup(ClassLoader.java:2428)
at com.github.jdnl.Main.main(Main.java:108)
I guess in the tests there is just always some native library that was
already loaded, so nativeLibraryContext was never empty.
I'm not entirely sure what the default library is supposed to be. Is it
just a dummy? Or is it backed by a bunch of system libraries? (in the
former case a fix could be to override `lookup` in the `defaultLibrary`
anonymous class to short-circuit the lookup process and throw a NSME
early).
This didn't seem to be an issue caused just by running on windows, so
I'm reporting.
Best regards,
Jorn Vernee
More information about the panama-dev
mailing list