< prev index next >

src/java.base/share/classes/sun/invoke/util/VerifyAccess.java

Print this page
*** 103,11 ***
          // The symbolic reference class (refc) must always be fully verified.
          if (!isClassAccessible(refc, lookupClass, prevLookupClass, allowedModes)) {
              return false;
          }
          // Usually refc and defc are the same, but verify defc also in case they differ.
!         if (defc == lookupClass  &&
              (allowedModes & PRIVATE) != 0)
              return true;        // easy check; all self-access is OK with a private lookup
  
          switch (mods & ALL_ACCESS_MODES) {
          case PUBLIC:
--- 103,11 ---
          // The symbolic reference class (refc) must always be fully verified.
          if (!isClassAccessible(refc, lookupClass, prevLookupClass, allowedModes)) {
              return false;
          }
          // Usually refc and defc are the same, but verify defc also in case they differ.
!         if (defc.asPrimaryType() == lookupClass  &&
              (allowedModes & PRIVATE) != 0)
              return true;        // easy check; all self-access is OK with a private lookup
  
          switch (mods & ALL_ACCESS_MODES) {
          case PUBLIC:

*** 138,19 ***
              // Rules for privates follows access rules for nestmates.
              boolean canAccess = ((allowedModes & PRIVATE) != 0 &&
                                   Reflection.areNestMates(defc, lookupClass));
              // for private methods the selected method equals the
              // resolved method - so refc == defc
!             assert (canAccess && refc == defc) || !canAccess;
              return canAccess;
          default:
              throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods));
          }
      }
  
      static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
!         return (refc == lookupClass ||
                  isSubClass(refc, lookupClass) ||
                  isSubClass(lookupClass, refc));
      }
  
      static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {
--- 138,19 ---
              // Rules for privates follows access rules for nestmates.
              boolean canAccess = ((allowedModes & PRIVATE) != 0 &&
                                   Reflection.areNestMates(defc, lookupClass));
              // for private methods the selected method equals the
              // resolved method - so refc == defc
!             assert (canAccess && refc.asPrimaryType() == defc.asPrimaryType()) || !canAccess;
              return canAccess;
          default:
              throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods));
          }
      }
  
      static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
!         return (refc.asPrimaryType() == lookupClass.asPrimaryType() ||
                  isSubClass(refc, lookupClass) ||
                  isSubClass(lookupClass, refc));
      }
  
      static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {

*** 271,11 ***
       * reference of a given reference class, is really visible to that class.
       * @param type the supposed type of a member or symbolic reference of refc
       * @param refc the class attempting to make the reference
       */
      public static boolean isTypeVisible(Class<?> type, Class<?> refc) {
!         if (type == refc) {
              return true;  // easy check
          }
          while (type.isArray())  type = type.getComponentType();
          if (type.isPrimitive() || type == Object.class) {
              return true;
--- 271,11 ---
       * reference of a given reference class, is really visible to that class.
       * @param type the supposed type of a member or symbolic reference of refc
       * @param refc the class attempting to make the reference
       */
      public static boolean isTypeVisible(Class<?> type, Class<?> refc) {
!         if (type.asPrimaryType() == refc.asPrimaryType()) {
              return true;  // easy check
          }
          while (type.isArray())  type = type.getComponentType();
          if (type.isPrimitive() || type == Object.class) {
              return true;

*** 319,10 ***
--- 319,11 ---
          // type ("type") and then is discarded.  Thus, the worst that can happen to
          // the "child" class loader is that it is bothered to load and report a class
          // that differs from "type"; this happens once due to JVM system dictionary
          // memoization.  And the caller never gets to look at the alternate type binding
          // ("res"), whether it exists or not.
+ 
          final String name = type.getName();
          @SuppressWarnings("removal")
          Class<?> res = java.security.AccessController.doPrivileged(
                  new java.security.PrivilegedAction<>() {
                      public Class<?> run() {

*** 331,11 ***
                          } catch (ClassNotFoundException | LinkageError e) {
                              return null; // Assume the class is not found
                          }
                      }
              });
!         return (type == res);
      }
  
      /**
       * Decide if the given method type, attributed to a member or symbolic
       * reference of a given reference class, is really visible to that class.
--- 332,11 ---
                          } catch (ClassNotFoundException | LinkageError e) {
                              return null; // Assume the class is not found
                          }
                      }
              });
!         return (type.asPrimaryType() == res);
      }
  
      /**
       * Decide if the given method type, attributed to a member or symbolic
       * reference of a given reference class, is really visible to that class.
< prev index next >