From 9169a8f064eb3edd344b02a5b1601b9e1059773c Mon Sep 17 00:00:00 2001 From: Harold Seigel Date: Wed, 4 Dec 2013 08:10:31 -0500 Subject: [PATCH] 8027458: VM anonymous classes: wrong context for protected access checks Use the anonymous class's host class for protected access checks Reviewed-by: acorn, coleenp, lfoltan --- hotspot/src/share/vm/runtime/reflection.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index 0a51b097e11..a8d24fa6d10 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -537,15 +537,26 @@ bool Reflection::verify_field_access(Klass* current_class, return true; } + Klass* host_class = current_class; + while (host_class->oop_is_instance() && + InstanceKlass::cast(host_class)->is_anonymous()) { + Klass* next_host_class = InstanceKlass::cast(host_class)->host_klass(); + if (next_host_class == NULL) break; + host_class = next_host_class; + } + if (host_class == field_class) { + return true; + } + if (access.is_protected()) { if (!protected_restriction) { - // See if current_class is a subclass of field_class - if (current_class->is_subclass_of(field_class)) { + // See if current_class (or outermost host class) is a subclass of field_class + if (host_class->is_subclass_of(field_class)) { if (access.is_static() || // static fields are ok, see 6622385 current_class == resolved_class || field_class == resolved_class || - current_class->is_subclass_of(resolved_class) || - resolved_class->is_subclass_of(current_class)) { + host_class->is_subclass_of(resolved_class) || + resolved_class->is_subclass_of(host_class)) { return true; } }