提交 ea490ec2 编写于 作者: H hseigel

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
上级 3c387a77
...@@ -537,15 +537,26 @@ bool Reflection::verify_field_access(Klass* current_class, ...@@ -537,15 +537,26 @@ bool Reflection::verify_field_access(Klass* current_class,
return true; 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 (access.is_protected()) {
if (!protected_restriction) { if (!protected_restriction) {
// See if current_class is a subclass of field_class // See if current_class (or outermost host class) is a subclass of field_class
if (current_class->is_subclass_of(field_class)) { if (host_class->is_subclass_of(field_class)) {
if (access.is_static() || // static fields are ok, see 6622385 if (access.is_static() || // static fields are ok, see 6622385
current_class == resolved_class || current_class == resolved_class ||
field_class == resolved_class || field_class == resolved_class ||
current_class->is_subclass_of(resolved_class) || host_class->is_subclass_of(resolved_class) ||
resolved_class->is_subclass_of(current_class)) { resolved_class->is_subclass_of(host_class)) {
return true; return true;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册