Wed, 04 Dec 2013 08:10:31 -0500
8027458: VM anonymous classes: wrong context for protected access checks
Summary: Use the anonymous class's host class for protected access checks
Reviewed-by: acorn, coleenp, lfoltan
src/share/vm/runtime/reflection.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/runtime/reflection.cpp Tue Dec 03 13:56:10 2013 -0800 1.2 +++ b/src/share/vm/runtime/reflection.cpp Wed Dec 04 08:10:31 2013 -0500 1.3 @@ -537,15 +537,26 @@ 1.4 return true; 1.5 } 1.6 1.7 + Klass* host_class = current_class; 1.8 + while (host_class->oop_is_instance() && 1.9 + InstanceKlass::cast(host_class)->is_anonymous()) { 1.10 + Klass* next_host_class = InstanceKlass::cast(host_class)->host_klass(); 1.11 + if (next_host_class == NULL) break; 1.12 + host_class = next_host_class; 1.13 + } 1.14 + if (host_class == field_class) { 1.15 + return true; 1.16 + } 1.17 + 1.18 if (access.is_protected()) { 1.19 if (!protected_restriction) { 1.20 - // See if current_class is a subclass of field_class 1.21 - if (current_class->is_subclass_of(field_class)) { 1.22 + // See if current_class (or outermost host class) is a subclass of field_class 1.23 + if (host_class->is_subclass_of(field_class)) { 1.24 if (access.is_static() || // static fields are ok, see 6622385 1.25 current_class == resolved_class || 1.26 field_class == resolved_class || 1.27 - current_class->is_subclass_of(resolved_class) || 1.28 - resolved_class->is_subclass_of(current_class)) { 1.29 + host_class->is_subclass_of(resolved_class) || 1.30 + resolved_class->is_subclass_of(host_class)) { 1.31 return true; 1.32 } 1.33 }