8027458: VM anonymous classes: wrong context for protected access checks

Wed, 04 Dec 2013 08:10:31 -0500

author
hseigel
date
Wed, 04 Dec 2013 08:10:31 -0500
changeset 6161
9a60f4ac6a37
parent 6147
e84d2afb2fb0
child 6162
a4f036ef52e8

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        }

mercurial