8358003: KlassTrainingData initializer reads garbage holder

Reviewed-by: coleenp, shade, vlivanov
This commit is contained in:
Igor Veresov 2025-06-04 14:07:49 +00:00
parent 0352477ff5
commit ae1892fb0f

View File

@ -432,24 +432,11 @@ void KlassTrainingData::print_on(outputStream* st, bool name_only) const {
} }
KlassTrainingData::KlassTrainingData(InstanceKlass* klass) : TrainingData(klass) { KlassTrainingData::KlassTrainingData(InstanceKlass* klass) : TrainingData(klass) {
if (holder() == klass) { assert(klass != nullptr, "");
return; // no change to make Handle hm(JavaThread::current(), klass->java_mirror());
} jobject hmj = JNIHandles::make_global(hm);
_holder_mirror = hmj;
jobject hmj = _holder_mirror; _holder = klass;
if (hmj != nullptr) { // clear out previous handle, if any
_holder_mirror = nullptr;
assert(JNIHandles::is_global_handle(hmj), "");
JNIHandles::destroy_global(hmj);
}
if (klass != nullptr) {
Handle hm(JavaThread::current(), klass->java_mirror());
hmj = JNIHandles::make_global(hm);
Atomic::release_store(&_holder_mirror, hmj);
}
Atomic::release_store(&_holder, const_cast<InstanceKlass*>(klass));
assert(holder() == klass, ""); assert(holder() == klass, "");
} }