RFR: 8303624: The java.lang.Thread.FieldHolder can be null for JNI attaching threads [v2]
Alan Bateman
alanb at openjdk.org
Wed Mar 8 08:20:16 UTC 2023
On Tue, 7 Mar 2023 22:58:47 GMT, David Holmes <dholmes at openjdk.org> wrote:
>> To support virtual threads a number of fields were moved out of `java.lang.Thread` into a separate `FieldHolder` object. The VM was updated to then access certain thread fields via the `FieldHolder`.
>>
>> The code for attaching a thread to the VM, specifically `allocate_threadObj` didn't allow for the `Thread` constructor throwing an exception, and so failing to allocate the `FieldHolder` before attempting to access a field through the `FieldHolder`. This resulted in assertion failures in `javaClasses.cpp` (or crashes in a product build). That code is fixed to ensure we cease processing if the constructor throws an exception.
>>
>> In addition, we need to recognise that whilst a native thread is attaching via JNI, it is partially initialized (to varying degrees) but also visible through JVMTI. Though the window is small JVMTI could get hold of an attaching thread and then invoke methods that would try to access uninitialized state. When this was state of `Thread` instance there was no problem as the object existed in its zero-initialized form (it had been allocated directly but no constructor run). However, anythng accessed via the `FieldHolder` is now a problem as the `FieldHolder` may not exist. So we modify all of the `FieldHolder` get/set methods to account for it being null: setters will do nothing, while getters return the default zero value for the field.
>>
>> Testing: tiers 1-3 as a sanity test
>>
>> There's no way to write a regression test for this.
>>
>> Thanks.
>
> David Holmes has updated the pull request incrementally with one additional commit since the last revision:
>
> Restore setter methods to assert holder!=nullptr
Marked as reviewed by alanb (Reviewer).
src/hotspot/share/classfile/javaClasses.cpp line 1637:
> 1635: // Convenience macros for setting and getting Thread fields that
> 1636: // are actually stored in the FieldHolder object of the thread.
> 1637: // The FieldHolder can be null whilst a thread is attaching via JNI.
Also the primordial thread. A JVMTI agent with the can_generate_early_vmstart capability sees the start phase before create_initial_thread and so many instrument some classes that are loaded early in the startup. Agents playing in this phase of startup are playing with fire of course.
-------------
PR: https://git.openjdk.org/jdk/pull/12892
More information about the hotspot-runtime-dev
mailing list