From 156f0b4332bf076165898417cf6678d2fc32df5c Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Tue, 30 Jul 2024 08:29:23 +0000 Subject: [PATCH] 8337213: Shenandoah: Add verification for class mirrors Reviewed-by: rkennke, wkemper --- .../share/gc/shenandoah/shenandoahAsserts.cpp | 19 +++++++++++++++++++ .../gc/shenandoah/shenandoahVerifier.cpp | 15 +++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp index beb4a1d2892..5215aa749ae 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp @@ -250,6 +250,25 @@ void ShenandoahAsserts::assert_correct(void* interior_loc, oop obj, const char* file, line); } } + + // Do additional checks for special objects: their fields can hold metadata as well. + // We want to check class loading/unloading did not corrupt them. + + if (java_lang_Class::is_instance(obj)) { + Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset()); + if (klass != nullptr && !Metaspace::contains(klass)) { + print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed", + "Instance class mirror should point to Metaspace", + file, line); + } + + Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset()); + if (array_klass != nullptr && !Metaspace::contains(array_klass)) { + print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed", + "Array class mirror should point to Metaspace", + file, line); + } + } } void ShenandoahAsserts::assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp index f67cafdb8fe..694736cea42 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp @@ -212,6 +212,21 @@ private: fwd_reg = obj_reg; } + // Do additional checks for special objects: their fields can hold metadata as well. + // We want to check class loading/unloading did not corrupt them. + + if (java_lang_Class::is_instance(obj)) { + Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset()); + check(ShenandoahAsserts::_safe_oop, obj, + klass == nullptr || Metaspace::contains(klass), + "Instance class mirror should point to Metaspace"); + + Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset()); + check(ShenandoahAsserts::_safe_oop, obj, + array_klass == nullptr || Metaspace::contains(array_klass), + "Array class mirror should point to Metaspace"); + } + // ------------ obj and fwd are safe at this point -------------- switch (_options._verify_marked) {