< prev index next >
src/hotspot/share/oops/instanceKlass.cpp
Print this page
*** 240,279 ****
// class as a nest member. If any of these conditions are not met we post the
// requested exception type (if any) and return NULL
const char* error = NULL;
! // Need to check we have an instance class first
if (k->is_instance_klass()) {
nest_host_k = InstanceKlass::cast(k);
// FIXME: an exception from this is perhaps impossible
bool is_member = nest_host_k->has_nest_member(this, CHECK_NULL);
if (is_member) {
- // Finally check we're in the same package - as there could be collusion
- // between untrusted types.
- if (is_same_class_package(nest_host_k)) {
// save resolved nest-host value
_nest_host = nest_host_k;
if (log_is_enabled(Trace, class, nestmates)) {
ResourceMark rm(THREAD);
log_trace(class, nestmates)("Resolved nest-host of %s to %s",
this->external_name(), k->external_name());
}
return nest_host_k;
}
- else {
- error = "types are in different packages";
- }
}
- else {
error = "current type is not listed as a nest member";
}
- }
else {
! error = "nest-host is not an instance class!";
}
if (log_is_enabled(Trace, class, nestmates)) {
ResourceMark rm(THREAD);
log_trace(class, nestmates)("Type %s is not a nest member of resolved type %s: %s",
--- 240,275 ----
// class as a nest member. If any of these conditions are not met we post the
// requested exception type (if any) and return NULL
const char* error = NULL;
! // JVMS 5.4.4 indicates package check comes first
! if (is_same_class_package(k)) {
!
! // Now check actual membership. We can't be a member if our "host" is
! // not an instance class.
if (k->is_instance_klass()) {
nest_host_k = InstanceKlass::cast(k);
// FIXME: an exception from this is perhaps impossible
bool is_member = nest_host_k->has_nest_member(this, CHECK_NULL);
if (is_member) {
// save resolved nest-host value
_nest_host = nest_host_k;
if (log_is_enabled(Trace, class, nestmates)) {
ResourceMark rm(THREAD);
log_trace(class, nestmates)("Resolved nest-host of %s to %s",
this->external_name(), k->external_name());
}
return nest_host_k;
}
}
error = "current type is not listed as a nest member";
}
else {
! error = "types are in different packages";
}
if (log_is_enabled(Trace, class, nestmates)) {
ResourceMark rm(THREAD);
log_trace(class, nestmates)("Type %s is not a nest member of resolved type %s: %s",
*** 312,333 ****
// resolved_nest_hosts
bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
assert(this != k, "this should be handled by higher-level code");
! // Per the JVMS we first resolve and validate the current class, then
// the target class k. Resolution exceptions will be passed on by upper
! // layers. IllegalAccessErrors from membership validation failures will
! // also be passed through.
! Symbol* iae = vmSymbols::java_lang_IllegalAccessError();
! InstanceKlass* cur_host = nest_host(iae, THREAD);
if (cur_host == NULL || HAS_PENDING_EXCEPTION) {
return false;
}
! Klass* k_nest_host = k->nest_host(iae, THREAD);
if (k_nest_host == NULL || HAS_PENDING_EXCEPTION) {
return false;
}
bool access = (cur_host == k_nest_host);
--- 308,329 ----
// resolved_nest_hosts
bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
assert(this != k, "this should be handled by higher-level code");
! // Per JVMS 5.4.4 we first resolve and validate the current class, then
// the target class k. Resolution exceptions will be passed on by upper
! // layers. IncompatibleClassChangeErrors from membership validation failures
! // will also be passed through.
! Symbol* icce = vmSymbols::java_lang_IncompatibleClassChangeError();
! InstanceKlass* cur_host = nest_host(icce, THREAD);
if (cur_host == NULL || HAS_PENDING_EXCEPTION) {
return false;
}
! Klass* k_nest_host = k->nest_host(icce, THREAD);
if (k_nest_host == NULL || HAS_PENDING_EXCEPTION) {
return false;
}
bool access = (cur_host == k_nest_host);
< prev index next >