RFR: 8278602: CDS dynamic dump may access unloaded classes [v3]

Calvin Cheung ccheung at openjdk.java.net
Fri Dec 17 15:59:28 UTC 2021


On Fri, 17 Dec 2021 07:27:45 GMT, Ioi Lam <iklam at openjdk.org> wrote:

>> Cause of crash:
>> 
>> When dumping a CDS archive,  while iterating over entries of the `SystemDictionaryShared::_dumptime_table`, we do not check whether the classes are already unloaded. In the crash, we are trying to call `InstanceKlass::signer()` but the class has already been unloaded.
>> 
>> Fix:
>> 
>> Override the  template function `DumpTimeSharedClassTable::iterate` to ensure iteration safety.  Do not iterate over a class if its `class_loader_data` is no longer alive.
>> 
>> The assert in `DumpTimeSharedClassTable::IterationHelper` found another existing bug -- we were calling `SystemDictionaryShared::is_dumptime_table_empty()` without holding the `DumpTimeTable_lock`. I delayed the call until we have grabbed the lock.
>> 
>> Testing:
>> 
>> I have attached a test case into the bug report. Without the fix, it would reproduce the same crash in less than a minute. With the fix, the crash is no longer reproducible.
>> 
>> Unfortunately, the test case requires a ZGC patch (thanks to @stefank) that adds delays to  increase the likelihood of seeing unloaded classes inside the `_dumptime_table`. Therefore, I cannot integrate the test as a jtreg test. I'll mark the bug as **noreg-hard**
>
> Ioi Lam has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains ten commits:
> 
>  - Merge branch 'master' into 8278602-cds-zgc-class-unload-bug
>  - added test case
>  - @coleenp and @stefank review comments
>  - cleaned up code
>  - add #if INCLUDE_CDS
>  - Merge branch 'master' into 8278602-cds-zgc-class-unload-bug
>  - using k->is_loader_alive() is enough
>  - Added DumpTimeSharedClassTable::iterate() to make sure every iteration goes through EligibleClassIterationHelper
>  - step1

Looks good. Just couple of questions on the test.

test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/test-classes/LotsUnloadApp.java line 81:

> 79:     static String x;
> 80:     static double d = 123;
> 81:     static float f = 456;

Are the above declarations needed? They are not being used.

test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/test-classes/LotsUnloadApp.java line 88:

> 86:     public void doit(Runnable r) {
> 87:         r.run();
> 88:     }

I don't see the above method being called.

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

PR: https://git.openjdk.java.net/jdk/pull/6859


More information about the hotspot-dev mailing list