8174092: Remove array-related access checks from Reflection::verify_class_access()
authorhseigel
Fri, 10 Feb 2017 07:46:07 -0500
changeset 46262 83280d968b96
parent 46261 75ce8b72e3c9
child 46263 1d8d6ddcc626
child 46264 03e564780d23
8174092: Remove array-related access checks from Reflection::verify_class_access() Summary: Change the parameter type to InstanceKlass* and fix the method's callers Reviewed-by: acorn, coleenp, gtriantafill, lfoltan
hotspot/src/share/vm/ci/ciEnv.cpp
hotspot/src/share/vm/classfile/classFileParser.cpp
hotspot/src/share/vm/interpreter/linkResolver.cpp
hotspot/src/share/vm/jvmci/jvmciEnv.cpp
hotspot/src/share/vm/prims/methodHandles.cpp
hotspot/src/share/vm/runtime/reflection.cpp
hotspot/src/share/vm/runtime/reflection.hpp
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -374,7 +374,7 @@
   }
   if (resolved_klass->is_instance_klass()) {
     return (Reflection::verify_class_access(accessing_klass->get_Klass(),
-                                            resolved_klass,
+                                            InstanceKlass::cast(resolved_klass),
                                             true) == Reflection::ACCESS_OK);
   }
   return true;
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -4374,10 +4374,12 @@
     }
 
     Reflection::VerifyClassAccessResults vca_result =
-      Reflection::verify_class_access(this_klass, super, false);
+      Reflection::verify_class_access(this_klass, InstanceKlass::cast(super), false);
     if (vca_result != Reflection::ACCESS_OK) {
       ResourceMark rm(THREAD);
-      char* msg =  Reflection::verify_class_access_msg(this_klass, super, vca_result);
+      char* msg = Reflection::verify_class_access_msg(this_klass,
+                                                      InstanceKlass::cast(super),
+                                                      vca_result);
       if (msg == NULL) {
         Exceptions::fthrow(
           THREAD_AND_LOCATION,
@@ -4406,10 +4408,12 @@
     Klass* const k = local_interfaces->at(i);
     assert (k != NULL && k->is_interface(), "invalid interface");
     Reflection::VerifyClassAccessResults vca_result =
-      Reflection::verify_class_access(this_klass, k, false);
+      Reflection::verify_class_access(this_klass, InstanceKlass::cast(k), false);
     if (vca_result != Reflection::ACCESS_OK) {
       ResourceMark rm(THREAD);
-      char* msg =  Reflection::verify_class_access_msg(this_klass, k, vca_result);
+      char* msg = Reflection::verify_class_access_msg(this_klass,
+                                                      InstanceKlass::cast(k),
+                                                      vca_result);
       if (msg == NULL) {
         Exceptions::fthrow(
           THREAD_AND_LOCATION,
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -275,10 +275,12 @@
 
 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
   Reflection::VerifyClassAccessResults vca_result =
-    Reflection::verify_class_access(ref_klass(), sel_klass(), true);
+    Reflection::verify_class_access(ref_klass(), InstanceKlass::cast(sel_klass()), true);
   if (vca_result != Reflection::ACCESS_OK) {
     ResourceMark rm(THREAD);
-    char* msg = Reflection::verify_class_access_msg(ref_klass(), sel_klass(), vca_result);
+    char* msg = Reflection::verify_class_access_msg(ref_klass(),
+                                                    InstanceKlass::cast(sel_klass()),
+                                                    vca_result);
     if (msg == NULL) {
       Exceptions::fthrow(
         THREAD_AND_LOCATION,
--- a/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -79,7 +79,7 @@
   }
   if (resolved_klass->is_instance_klass()) {
     Reflection::VerifyClassAccessResults result =
-      Reflection::verify_class_access(accessing_klass(), resolved_klass(), true);
+      Reflection::verify_class_access(accessing_klass(), InstanceKlass::cast(resolved_klass()), true);
     return result == Reflection::ACCESS_OK;
   }
   return true;
--- a/hotspot/src/share/vm/prims/methodHandles.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1209,7 +1209,7 @@
       // Emulate LinkResolver::check_klass_accessability.
       Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
       if (Reflection::verify_class_access(caller,
-                                          reference_klass,
+                                          InstanceKlass::cast(reference_klass),
                                           true) != Reflection::ACCESS_OK) {
         THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
       }
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -477,7 +477,7 @@
  Note: a loose module is a module that can read all current and future unnamed modules.
 */
 Reflection::VerifyClassAccessResults Reflection::verify_class_access(
-  const Klass* current_class, const Klass* new_class, bool classloader_only) {
+  const Klass* current_class, const InstanceKlass* new_class, bool classloader_only) {
 
   // Verify that current_class can access new_class.  If the classloader_only
   // flag is set, we automatically allow any accesses in which current_class
@@ -504,13 +504,6 @@
     // Find the module entry for current_class, the accessor
     ModuleEntry* module_from = current_class->module();
     // Find the module entry for new_class, the accessee
-    if (new_class->is_objArray_klass()) {
-      new_class = ObjArrayKlass::cast(new_class)->bottom_klass();
-    }
-    if (new_class->is_typeArray_klass()) {
-      // A TypeArray's defining module is java.base, access to the TypeArray is allowed
-      return ACCESS_OK;
-    }
     ModuleEntry* module_to = new_class->module();
 
     // both in same (possibly unnamed) module
@@ -563,7 +556,7 @@
 // Return an error message specific to the specified Klass*'s and result.
 // This function must be called from within a block containing a ResourceMark.
 char* Reflection::verify_class_access_msg(const Klass* current_class,
-                                          const Klass* new_class,
+                                          const InstanceKlass* new_class,
                                           VerifyClassAccessResults result) {
   assert(result != ACCESS_OK, "must be failure result");
   char * msg = NULL;
--- a/hotspot/src/share/vm/runtime/reflection.hpp	Thu Feb 09 16:03:03 2017 -0500
+++ b/hotspot/src/share/vm/runtime/reflection.hpp	Fri Feb 10 07:46:07 2017 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -82,12 +82,12 @@
 
   // Verification
   static VerifyClassAccessResults verify_class_access(const Klass* current_class,
-                                                      const Klass* new_class,
+                                                      const InstanceKlass* new_class,
                                                       bool classloader_only);
   // Return an error message specific to the specified Klass*'s and result.
   // This function must be called from within a block containing a ResourceMark.
   static char*    verify_class_access_msg(const Klass* current_class,
-                                          const Klass* new_class,
+                                          const InstanceKlass* new_class,
                                           const VerifyClassAccessResults result);
 
   static bool     verify_field_access(const Klass* current_class,