src/share/vm/classfile/classFileParser.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/classfile/classFileParser.cpp Tue Nov 15 08:50:32 2016
--- new/src/share/vm/classfile/classFileParser.cpp Tue Nov 15 08:50:30 2016
*** 4346,4363 ****
--- 4346,4383 ----
}
static void check_super_class_access(const InstanceKlass* this_klass, TRAPS) {
assert(this_klass != NULL, "invariant");
const Klass* const super = this_klass->super();
+
if (super != NULL) {
+ // Throw an exception if superclass is in package jdk.internal.reflect and
+ // loader is neither the boot loader nor a subclass of the special reflection
+ // class loader
+ assert(super->is_instance_klass(), "super is not instance klass");
+ PackageEntry* super_package = super->package();
+ if (super_package != NULL) {
+ ClassLoaderData* this_cld = this_klass->class_loader_data();
+ if (super_package->name() == vmSymbols::jdk_internal_reflect() &&
+ !this_cld->is_the_null_class_loader_data() &&
+ this_klass->class_loader() ==
+ java_lang_ClassLoader::non_reflection_class_loader(this_klass->class_loader())) {
+ ResourceMark rm(THREAD);
+ Exceptions::fthrow(
+ THREAD_AND_LOCATION,
+ vmSymbols::java_lang_IllegalAccessError(),
+ "class %s loaded by %s cannot access jdk/internal/reflect superclass %s",
+ this_klass->external_name(), this_cld->loader_name(), super->external_name());
+ }
+ }
+
Reflection::VerifyClassAccessResults vca_result =
Reflection::verify_class_access(this_klass, super, false);
if (vca_result != Reflection::ACCESS_OK) {
ResourceMark rm(THREAD);
char* msg = Reflection::verify_class_access_msg(this_klass, super, vca_result);
if (msg == NULL) {
ResourceMark rm(THREAD);
Exceptions::fthrow(
THREAD_AND_LOCATION,
vmSymbols::java_lang_IllegalAccessError(),
"class %s cannot access its superclass %s",
this_klass->external_name(),
src/share/vm/classfile/classFileParser.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File