RFR: 8342303: Segfault in update_inherited_vtable: AppCDS, old bytecode, and redefineClasses

Calvin Cheung ccheung at openjdk.org
Tue Oct 29 21:13:06 UTC 2024


On Tue, 29 Oct 2024 10:00:56 GMT, David Holmes <dholmes at openjdk.org> wrote:

>> A simple fix to avoid referencing invalid vtable and itable entires in `InstanceKlass::restore_unshareable_info` if a class is not linked during CDS dump time.
>> 
>> Passed tiers 1 - 4 testing.
>> 
>> ---------
>> ### Progress
>> - [ ] Change must be properly reviewed (1 review required, with at least 1 [Reviewer](https://openjdk.org/bylaws#reviewer))
>> - [x] Change must not contain extraneous whitespace
>> - [x] Commit message must refer to an issue
>> 
>> 
>> 
>> ### Reviewing
>> <details><summary>Using <code>git</code></summary>
>> 
>> Checkout this PR locally: \
>> `$ git fetch https://git.openjdk.org/jdk.git pull/21667/head:pull/21667` \
>> `$ git checkout pull/21667`
>> 
>> Update a local copy of the PR: \
>> `$ git checkout pull/21667` \
>> `$ git pull https://git.openjdk.org/jdk.git pull/21667/head`
>> 
>> </details>
>> <details><summary>Using Skara CLI tools</summary>
>> 
>> Checkout this PR locally: \
>> `$ git pr checkout 21667`
>> 
>> View PR using the GUI difftool: \
>> `$ git pr show -t 21667`
>> 
>> </details>
>> <details><summary>Using diff file</summary>
>> 
>> Download this PR as a diff file: \
>> <a href="https://git.openjdk.org/jdk/pull/21667.diff">https://git.openjdk.org/jdk/pull/21667.diff</a>
>> 
>> </details>
>
> test/hotspot/jtreg/runtime/cds/appcds/jvmti/redefineClasses/OldClassAndRedefineClassApp.java line 34:
> 
>> 32:         System.out.println("Main: loading OldSuper");
>> 33:         // Load an old class (version 49), but not linking it.
>> 34:         Thread.currentThread().getContextClassLoader().loadClass("OldSuper");
> 
> Why the context classloader? Has it been set in this test?

In this case, the `getContextClassLoader()` is default to the AppClassLoader.
I added some println in the test:

        System.out.println("    ClassLoader " + Thread.currentThread().getContextClassLoader());
        Class superCls = Thread.currentThread().getContextClassLoader().loadClass("OldSuper");
        System.out.println("OldSuper>> loader = " + superCls.getClassLoader());


below is the output:

    ClassLoader jdk.internal.loader.ClassLoaders$AppClassLoader at 5451c3a8
OldSuper>> loader = jdk.internal.loader.ClassLoaders$AppClassLoader at 5451c3a8

If the class is in the boot class path, then the class should be loaded by the boot class loader.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21667#discussion_r1821536499


More information about the hotspot-runtime-dev mailing list