RFR: 8264990: Fix segfault when accessing local storage in webview

Matthias Bläsing github.com+2179736+matthiasblaesing at openjdk.java.net
Fri Apr 9 19:37:40 UTC 2021


On Thu, 8 Apr 2021 20:27:45 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

>> The functions from FileSystemJava are called from different threads the
>> root problem manifests because the JNI FindClass function behaves
>> differently when called from a context that is the ancestor of a java
>> frame compared to when called in isolation.
>> 
>> A segmentation fault is observed when local storage of a webview is
>> accessed. At that time a new native thread is spun up and that sets up
>> the local storage, by calling into the JVM via
>> WTF::FileSystem::makeAllDirectories. At that point GetFileSystemClass is
>> invoked to get a referenc to the java implementation of the FileSystem.
>> As this is is called from a new native thread (no java context
>> available), JNI uses the system classloader to locate the class. This
>> fails if the JavaFX modules are not on the boot module/class path.
>> 
>> Instead on relying on fetching the class reference everytime it is
>> needed, this change fetches it once when the JavaFX library is loaded
>> and stores it in the WTF namespace.
>> 
>> In addition to this it was observed, that there is no attachment to the
>> JVM done when calling into the filesystem. No fault was observed, but
>> the JNI specs indicate, that the JNIEnv interface is only valid when
>> attached.
>
> tests/system/src/testapp7/java/mymod/myapp7/LocalStorageAccessWithModuleLayer.java line 92:
> 
>> 90:                     }
>> 91:                 });
>> 92:         webview.getEngine().load(LocalStorageAccessWithModuleLayer.class.getResource("/LocalStorageAccess.html").toExternalForm());
> 
> This fails to find the resource when I run the test via gradle. I recommend putting it in the same package as the class and removing the leading `/` (e.g., see the FXML resources in `testapp6` or `testscriptapp1`).

Can you tell me how you ran it? I ensured, that the test failed with a segfault before continuing with the fix. While I did that I indeed placed the file in the wrong directory, but currently I see no test failures locally. I run:

./gradlew  -PFULL_TEST=true -PUSE_ROBOT=true :systemTests:cleanTest :systemTests:test --tests test.com.sun.webkit.LocalStorageAccessTest 

to only invoke the new test. I'll move the file to the package, but I'd like to understand where I went wrong.

-------------

PR: https://git.openjdk.java.net/jfx/pull/458


More information about the openjfx-dev mailing list