From 68a9c81040affe165341ec7dcd2c07932c8a7188 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Fri, 22 Sep 2023 21:58:01 +0000 Subject: [PATCH] 8316711: SEGV in LoaderConstraintTable::find_loader_constraint after JDK-8310874 Reviewed-by: dcubed, iklam --- src/hotspot/share/classfile/loaderConstraints.cpp | 1 + src/hotspot/share/classfile/systemDictionary.cpp | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/classfile/loaderConstraints.cpp b/src/hotspot/share/classfile/loaderConstraints.cpp index a613bb9f26d..4206fc10d4f 100644 --- a/src/hotspot/share/classfile/loaderConstraints.cpp +++ b/src/hotspot/share/classfile/loaderConstraints.cpp @@ -448,6 +448,7 @@ InstanceKlass* LoaderConstraintTable::find_constrained_klass(Symbol* name, void LoaderConstraintTable::remove_failed_loaded_klass(InstanceKlass* klass, ClassLoaderData* loader) { + MutexLocker ml(SystemDictionary_lock); Symbol* name = klass->name(); LoaderConstraint *p = find_loader_constraint(name, loader); if (p != nullptr && p->klass() != nullptr && p->klass() == klass) { diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index 10ceb008794..b5a41138aa3 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -1524,12 +1524,10 @@ InstanceKlass* SystemDictionary::find_or_define_instance_class(Symbol* class_nam assert(defined_k != nullptr, "Should have a klass if there's no exception"); k->class_loader_data()->add_to_deallocate_list(k); } else if (HAS_PENDING_EXCEPTION) { + // Remove this InstanceKlass from the LoaderConstraintTable if added. + LoaderConstraintTable::remove_failed_loaded_klass(k, class_loader_data(class_loader)); assert(defined_k == nullptr, "Should not have a klass if there's an exception"); k->class_loader_data()->add_to_deallocate_list(k); - - // Also remove this InstanceKlass from the LoaderConstraintTable if added. - MutexLocker ml(SystemDictionary_lock); - LoaderConstraintTable::remove_failed_loaded_klass(k, class_loader_data(class_loader)); } return defined_k; }