8021262: Make nashorn access checks consistent with underlying dynalink

Wed, 24 Jul 2013 20:28:03 +0530

author
sundar
date
Wed, 24 Jul 2013 20:28:03 +0530
changeset 468
dc54df348a58
parent 467
573cc6eb66ae
child 469
d203d68f6624

8021262: Make nashorn access checks consistent with underlying dynalink
Reviewed-by: jlaskey, lagergren, attila

make/code_coverage.xml file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/codegen/SpillObjectCreator.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/objects/NativeDate.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/objects/NativeObject.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/Context.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/NashornLoader.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/PropertyMap.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/ScriptObject.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/ScriptRuntime.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/Source.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java file | annotate | diff | comparison | revisions
src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java file | annotate | diff | comparison | revisions
test/script/sandbox/nashorninternals.js file | annotate | diff | comparison | revisions
test/script/trusted/JDK-8006529.js file | annotate | diff | comparison | revisions
test/script/trusted/JDK-8021129.js file | annotate | diff | comparison | revisions
test/script/trusted/JDK-8021189.js file | annotate | diff | comparison | revisions
test/script/trusted/JDK-8021189.js.EXPECTED file | annotate | diff | comparison | revisions
test/src/jdk/nashorn/test/models/InternalRunnableSuperclass.java file | annotate | diff | comparison | revisions
     1.1 --- a/make/code_coverage.xml	Wed Jul 24 08:25:04 2013 -0300
     1.2 +++ b/make/code_coverage.xml	Wed Jul 24 20:28:03 2013 +0530
     1.3 @@ -132,7 +132,7 @@
     1.4        <arg value="-exclude"/>
     1.5        <arg value="com\.oracle\.nashorn\.runtime\.ScriptRuntime*"/>
     1.6        <arg value="-exclude"/>
     1.7 -      <arg value="jdk\.nashorn\.internal\.javaadapters*"/>
     1.8 +      <arg value="jdk\.nashorn\.javaadapters*"/>
     1.9        <arg value="-exclude"/>
    1.10        <arg value="jdk\.nashorn\.internal\.objects\.annotations*"/>
    1.11        <arg value="-exclude"/>
     2.1 --- a/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Wed Jul 24 08:25:04 2013 -0300
     2.2 +++ b/src/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Wed Jul 24 20:28:03 2013 +0530
     2.3 @@ -65,7 +65,7 @@
     2.4  
     2.5          final int      length       = keys.size();
     2.6          final Object[] presetValues = new Object[propertyMap.size()];
     2.7 -        final Class    clazz        = JO.class;
     2.8 +        final Class<?> clazz        = JO.class;
     2.9  
    2.10          // Compute constant values
    2.11          for (int i = 0; i < length; i++) {
     3.1 --- a/src/jdk/nashorn/internal/objects/NativeDate.java	Wed Jul 24 08:25:04 2013 -0300
     3.2 +++ b/src/jdk/nashorn/internal/objects/NativeDate.java	Wed Jul 24 20:28:03 2013 +0530
     3.3 @@ -44,7 +44,6 @@
     3.4  import jdk.nashorn.internal.runtime.JSType;
     3.5  import jdk.nashorn.internal.runtime.PropertyMap;
     3.6  import jdk.nashorn.internal.runtime.ScriptEnvironment;
     3.7 -import jdk.nashorn.internal.runtime.ScriptFunction;
     3.8  import jdk.nashorn.internal.runtime.ScriptObject;
     3.9  import jdk.nashorn.internal.runtime.ScriptRuntime;
    3.10  import jdk.nashorn.internal.runtime.linker.Bootstrap;
     4.1 --- a/src/jdk/nashorn/internal/objects/NativeObject.java	Wed Jul 24 08:25:04 2013 -0300
     4.2 +++ b/src/jdk/nashorn/internal/objects/NativeObject.java	Wed Jul 24 20:28:03 2013 +0530
     4.3 @@ -55,7 +55,6 @@
     4.4  import jdk.nashorn.internal.runtime.JSType;
     4.5  import jdk.nashorn.internal.runtime.Property;
     4.6  import jdk.nashorn.internal.runtime.PropertyMap;
     4.7 -import jdk.nashorn.internal.runtime.ScriptFunction;
     4.8  import jdk.nashorn.internal.runtime.ScriptObject;
     4.9  import jdk.nashorn.internal.runtime.ScriptRuntime;
    4.10  import jdk.nashorn.internal.runtime.linker.Bootstrap;
     5.1 --- a/src/jdk/nashorn/internal/runtime/Context.java	Wed Jul 24 08:25:04 2013 -0300
     5.2 +++ b/src/jdk/nashorn/internal/runtime/Context.java	Wed Jul 24 20:28:03 2013 +0530
     5.3 @@ -40,10 +40,13 @@
     5.4  import java.util.concurrent.atomic.AtomicLong;
     5.5  import java.net.MalformedURLException;
     5.6  import java.net.URL;
     5.7 +import java.security.AccessControlContext;
     5.8  import java.security.AccessController;
     5.9  import java.security.CodeSigner;
    5.10  import java.security.CodeSource;
    5.11 +import java.security.Permissions;
    5.12  import java.security.PrivilegedAction;
    5.13 +import java.security.ProtectionDomain;
    5.14  import java.util.Map;
    5.15  import jdk.internal.org.objectweb.asm.ClassReader;
    5.16  import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
    5.17 @@ -201,6 +204,7 @@
    5.18  
    5.19      private static final ClassLoader myLoader = Context.class.getClassLoader();
    5.20      private static final StructureLoader sharedLoader;
    5.21 +    private static final AccessControlContext NO_PERMISSIONS_CONTEXT;
    5.22  
    5.23      static {
    5.24          sharedLoader = AccessController.doPrivileged(new PrivilegedAction<StructureLoader>() {
    5.25 @@ -209,6 +213,7 @@
    5.26                  return new StructureLoader(myLoader, null);
    5.27              }
    5.28          });
    5.29 +        NO_PERMISSIONS_CONTEXT = new AccessControlContext(new ProtectionDomain[] { new ProtectionDomain(null, new Permissions()) });
    5.30      }
    5.31  
    5.32      /**
    5.33 @@ -479,7 +484,7 @@
    5.34                  source = new Source(name, script);
    5.35              }
    5.36          } else if (src instanceof Map) {
    5.37 -            final Map map = (Map)src;
    5.38 +            final Map<?,?> map = (Map<?,?>)src;
    5.39              if (map.containsKey("script") && map.containsKey("name")) {
    5.40                  final String script = JSType.toString(map.get("script"));
    5.41                  final String name   = JSType.toString(map.get("name"));
    5.42 @@ -549,11 +554,14 @@
    5.43       * @throws ClassNotFoundException if structure class cannot be resolved
    5.44       */
    5.45      public static Class<?> forStructureClass(final String fullName) throws ClassNotFoundException {
    5.46 +        if (System.getSecurityManager() != null && !NashornLoader.isStructureClass(fullName)) {
    5.47 +            throw new ClassNotFoundException(fullName);
    5.48 +        }
    5.49          return Class.forName(fullName, true, sharedLoader);
    5.50      }
    5.51  
    5.52      /**
    5.53 -     * Checks that the given package can be accessed from current call stack.
    5.54 +     * Checks that the given package can be accessed from no permissions context.
    5.55       *
    5.56       * @param fullName fully qualified package name
    5.57       * @throw SecurityException if not accessible
    5.58 @@ -563,13 +571,19 @@
    5.59          if (index != -1) {
    5.60              final SecurityManager sm = System.getSecurityManager();
    5.61              if (sm != null) {
    5.62 -                sm.checkPackageAccess(fullName.substring(0, index));
    5.63 +                AccessController.doPrivileged(new PrivilegedAction<Void>() {
    5.64 +                    @Override
    5.65 +                    public Void run() {
    5.66 +                        sm.checkPackageAccess(fullName.substring(0, index));
    5.67 +                        return null;
    5.68 +                    }
    5.69 +                }, NO_PERMISSIONS_CONTEXT);
    5.70              }
    5.71          }
    5.72      }
    5.73  
    5.74      /**
    5.75 -     * Checks that the given package can be accessed from current call stack.
    5.76 +     * Checks that the given package can be accessed from no permissions context.
    5.77       *
    5.78       * @param fullName fully qualified package name
    5.79       * @return true if package is accessible, false otherwise
    5.80 @@ -584,7 +598,7 @@
    5.81      }
    5.82  
    5.83      /**
    5.84 -     * Checks that the given Class can be accessed from current call stack and is public.
    5.85 +     * Checks that the given Class is public and it can be accessed from no permissions context.
    5.86       *
    5.87       * @param clazz Class object to check
    5.88       * @return true if Class is accessible, false otherwise
     6.1 --- a/src/jdk/nashorn/internal/runtime/NashornLoader.java	Wed Jul 24 08:25:04 2013 -0300
     6.2 +++ b/src/jdk/nashorn/internal/runtime/NashornLoader.java	Wed Jul 24 20:28:03 2013 +0530
     6.3 @@ -118,6 +118,10 @@
     6.4          return permCollection;
     6.5      }
     6.6  
     6.7 +    static boolean isStructureClass(final String fullName) {
     6.8 +        return fullName.startsWith(SCRIPTS_PKG);
     6.9 +    }
    6.10 +
    6.11      /**
    6.12       * Create a secure URL class loader for the given classpath
    6.13       * @param classPath classpath for the loader to search from
     7.1 --- a/src/jdk/nashorn/internal/runtime/PropertyMap.java	Wed Jul 24 08:25:04 2013 -0300
     7.2 +++ b/src/jdk/nashorn/internal/runtime/PropertyMap.java	Wed Jul 24 20:28:03 2013 +0530
     7.3 @@ -352,11 +352,15 @@
     7.4          return newMap;
     7.5      }
     7.6  
     7.7 -    /*
     7.8 +    /**
     7.9       * Make a new UserAccessorProperty property. getter and setter functions are stored in
    7.10       * this ScriptObject and slot values are used in property object. Note that slots
    7.11       * are assigned speculatively and should be added to map before adding other
    7.12       * properties.
    7.13 +     *
    7.14 +     * @param key the property name
    7.15 +     * @param propertyFlags attribute flags of the property
    7.16 +     * @return the newly created UserAccessorProperty
    7.17       */
    7.18      public UserAccessorProperty newUserAccessors(final String key, final int propertyFlags) {
    7.19          int oldSpillLength = spillLength;
     8.1 --- a/src/jdk/nashorn/internal/runtime/ScriptObject.java	Wed Jul 24 08:25:04 2013 -0300
     8.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java	Wed Jul 24 20:28:03 2013 +0530
     8.3 @@ -3192,9 +3192,15 @@
     8.4          return true;
     8.5      }
     8.6  
     8.7 -    /*
     8.8 +    /**
     8.9       * Make a new UserAccessorProperty property. getter and setter functions are stored in
    8.10       * this ScriptObject and slot values are used in property object.
    8.11 +     *
    8.12 +     * @param key the property name
    8.13 +     * @param propertyFlags attribute flags of the property
    8.14 +     * @param getter getter function for the property
    8.15 +     * @param setter setter function for the property
    8.16 +     * @return the newly created UserAccessorProperty
    8.17       */
    8.18      protected final UserAccessorProperty newUserAccessors(final String key, final int propertyFlags, final ScriptFunction getter, final ScriptFunction setter) {
    8.19          final UserAccessorProperty property = getMap().newUserAccessors(key, propertyFlags);
     9.1 --- a/src/jdk/nashorn/internal/runtime/ScriptRuntime.java	Wed Jul 24 08:25:04 2013 -0300
     9.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptRuntime.java	Wed Jul 24 20:28:03 2013 +0530
     9.3 @@ -391,7 +391,7 @@
     9.4          return construct(target, args);
     9.5      }
     9.6  
     9.7 -    /*
     9.8 +    /**
     9.9       * Call a script function as a constructor with given args.
    9.10       *
    9.11       * @param target ScriptFunction object.
    10.1 --- a/src/jdk/nashorn/internal/runtime/Source.java	Wed Jul 24 08:25:04 2013 -0300
    10.2 +++ b/src/jdk/nashorn/internal/runtime/Source.java	Wed Jul 24 20:28:03 2013 +0530
    10.3 @@ -384,11 +384,7 @@
    10.4          }
    10.5  
    10.6          final byte[] buf = Files.readAllBytes(file.toPath());
    10.7 -        if (cs != null) {
    10.8 -            return new String(buf, cs).toCharArray();
    10.9 -        } else {
   10.10 -            return byteToCharArray(buf);
   10.11 -        }
   10.12 +        return (cs != null)? new String(buf, cs).toCharArray() : byteToCharArray(buf);
   10.13      }
   10.14  
   10.15      /**
   10.16 @@ -465,11 +461,7 @@
   10.17      }
   10.18  
   10.19      private static char[] readFully(final InputStream is, final Charset cs) throws IOException {
   10.20 -        if (cs != null) {
   10.21 -            return new String(readBytes(is), cs).toCharArray();
   10.22 -        } else {
   10.23 -            return readFully(is);
   10.24 -        }
   10.25 +        return (cs != null)? new String(readBytes(is), cs).toCharArray() : readFully(is);
   10.26      }
   10.27  
   10.28      private static char[] readFully(final InputStream is) throws IOException {
    11.1 --- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Wed Jul 24 08:25:04 2013 -0300
    11.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Wed Jul 24 20:28:03 2013 +0530
    11.3 @@ -51,7 +51,6 @@
    11.4  import java.lang.reflect.Modifier;
    11.5  import java.security.AccessController;
    11.6  import java.security.PrivilegedAction;
    11.7 -import java.security.SecureRandom;
    11.8  import java.util.Arrays;
    11.9  import java.util.Collection;
   11.10  import java.util.HashSet;
   11.11 @@ -179,8 +178,6 @@
   11.12       */
   11.13      private static final Collection<MethodInfo> EXCLUDED = getExcludedMethods();
   11.14  
   11.15 -    private static final Random random = new SecureRandom();
   11.16 -
   11.17      // This is the superclass for our generated adapter.
   11.18      private final Class<?> superClass;
   11.19      // Class loader used as the parent for the class loader we'll create to load the generated class. It will be a class
   11.20 @@ -230,12 +227,6 @@
   11.21          superClassName = Type.getInternalName(superClass);
   11.22          generatedClassName = getGeneratedClassName(superClass, interfaces);
   11.23  
   11.24 -        // Randomize the name of the privileged global setter, to make it non-feasible to find.
   11.25 -        final long l;
   11.26 -        synchronized(random) {
   11.27 -            l = random.nextLong();
   11.28 -        }
   11.29 -
   11.30          cw.visit(Opcodes.V1_7, ACC_PUBLIC | ACC_SUPER | ACC_FINAL, generatedClassName, null, superClassName, getInternalTypeNames(interfaces));
   11.31  
   11.32          generateGlobalFields();
    12.1 --- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java	Wed Jul 24 08:25:04 2013 -0300
    12.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java	Wed Jul 24 20:28:03 2013 +0530
    12.3 @@ -73,16 +73,6 @@
    12.4          });
    12.5      }
    12.6  
    12.7 -    private static class AdapterLoader extends SecureClassLoader {
    12.8 -        AdapterLoader(ClassLoader parent) {
    12.9 -            super(parent);
   12.10 -        }
   12.11 -    }
   12.12 -
   12.13 -    static boolean isAdapterClass(Class<?> clazz) {
   12.14 -        return clazz.getClassLoader() instanceof AdapterLoader;
   12.15 -    }
   12.16 -
   12.17      // Note that the adapter class is created in the protection domain of the class/interface being
   12.18      // extended/implemented, and only the privileged global setter action class is generated in the protection domain
   12.19      // of Nashorn itself. Also note that the creation and loading of the global setter is deferred until it is
   12.20 @@ -91,7 +81,7 @@
   12.21      // with ability to introspect on the class and use setAccessible(true) on it could invoke the method. It's a
   12.22      // security tradeoff...
   12.23      private ClassLoader createClassLoader(final ClassLoader parentLoader) {
   12.24 -        return new AdapterLoader(parentLoader) {
   12.25 +        return new SecureClassLoader(parentLoader) {
   12.26              private final ClassLoader myLoader = getClass().getClassLoader();
   12.27  
   12.28              @Override
    13.1 --- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	Wed Jul 24 08:25:04 2013 -0300
    13.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	Wed Jul 24 20:28:03 2013 +0530
    13.3 @@ -138,15 +138,6 @@
    13.4      }
    13.5  
    13.6      /**
    13.7 -     * Tells if the given Class is an adapter or support class
    13.8 -     * @param clazz Class object
    13.9 -     * @return true if the Class given is adapter or support class
   13.10 -     */
   13.11 -    public static boolean isAdapterClass(Class<?> clazz) {
   13.12 -        return JavaAdapterClassLoader.isAdapterClass(clazz);
   13.13 -    }
   13.14 -
   13.15 -    /**
   13.16       * Returns whether an instance of the specified class/interface can be generated from a ScriptFunction. Returns true
   13.17       * iff: the adapter for the class/interface can be created, it is abstract (this includes interfaces), it has at
   13.18       * least one abstract method, all the abstract methods share the same name, and it has a public or protected default
    14.1 --- a/src/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java	Wed Jul 24 08:25:04 2013 -0300
    14.2 +++ b/src/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java	Wed Jul 24 20:28:03 2013 +0530
    14.3 @@ -477,6 +477,7 @@
    14.4          /**
    14.5           * Tracer function that logs a callsite miss
    14.6           *
    14.7 +         * @param desc callsite descriptor string
    14.8           * @param args arguments to function
    14.9           *
   14.10           * @throws Throwable if invocation failes or throws exception/error
    15.1 --- a/src/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java	Wed Jul 24 08:25:04 2013 -0300
    15.2 +++ b/src/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java	Wed Jul 24 20:28:03 2013 +0530
    15.3 @@ -169,31 +169,43 @@
    15.4          return ScriptRuntime.safeToString(linkRequest.getArguments()[1]);
    15.5      }
    15.6  
    15.7 -    // Returns @FunctionalInterface annotated interface's single abstract method.
    15.8 -    // If not found, returns null
    15.9 -    static Method getFunctionalInterfaceMethod(final Class<?> clazz) {
   15.10 -        if (clazz == null) {
   15.11 -            return null;
   15.12 +    // cache of @FunctionalInterface method of implementor classes
   15.13 +    private static final ClassValue<Method> FUNCTIONAL_IFACE_METHOD = new ClassValue<Method>() {
   15.14 +        @Override
   15.15 +        protected Method computeValue(final Class<?> type) {
   15.16 +            return findFunctionalInterfaceMethod(type);
   15.17          }
   15.18  
   15.19 -        for (Class<?> iface : clazz.getInterfaces()) {
   15.20 -            // check accessiblity up-front
   15.21 -            if (! Context.isAccessibleClass(iface)) {
   15.22 -                continue;
   15.23 +        private Method findFunctionalInterfaceMethod(final Class<?> clazz) {
   15.24 +            if (clazz == null) {
   15.25 +                return null;
   15.26              }
   15.27  
   15.28 -            // check for @FunctionalInterface
   15.29 -            if (iface.isAnnotationPresent(FunctionalInterface.class)) {
   15.30 -                // return the first abstract method
   15.31 -                for (final Method m : iface.getMethods()) {
   15.32 -                    if (Modifier.isAbstract(m.getModifiers())) {
   15.33 -                        return m;
   15.34 +            for (Class<?> iface : clazz.getInterfaces()) {
   15.35 +                // check accessiblity up-front
   15.36 +                if (! Context.isAccessibleClass(iface)) {
   15.37 +                    continue;
   15.38 +                }
   15.39 +
   15.40 +                // check for @FunctionalInterface
   15.41 +                if (iface.isAnnotationPresent(FunctionalInterface.class)) {
   15.42 +                    // return the first abstract method
   15.43 +                    for (final Method m : iface.getMethods()) {
   15.44 +                        if (Modifier.isAbstract(m.getModifiers())) {
   15.45 +                            return m;
   15.46 +                        }
   15.47                      }
   15.48                  }
   15.49              }
   15.50 +
   15.51 +            // did not find here, try super class
   15.52 +            return findFunctionalInterfaceMethod(clazz.getSuperclass());
   15.53          }
   15.54 +    };
   15.55  
   15.56 -        // did not find here, try super class
   15.57 -        return getFunctionalInterfaceMethod(clazz.getSuperclass());
   15.58 +    // Returns @FunctionalInterface annotated interface's single abstract
   15.59 +    // method. If not found, returns null.
   15.60 +    static Method getFunctionalInterfaceMethod(final Class<?> clazz) {
   15.61 +        return FUNCTIONAL_IFACE_METHOD.get(clazz);
   15.62      }
   15.63  }
    16.1 --- a/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java	Wed Jul 24 08:25:04 2013 -0300
    16.2 +++ b/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java	Wed Jul 24 20:28:03 2013 +0530
    16.3 @@ -34,6 +34,7 @@
    16.4  import jdk.internal.dynalink.linker.LinkerServices;
    16.5  import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker;
    16.6  import jdk.internal.dynalink.support.Guards;
    16.7 +import jdk.nashorn.internal.runtime.Context;
    16.8  import jdk.nashorn.internal.runtime.ECMAErrors;
    16.9  
   16.10  /**
   16.11 @@ -68,6 +69,9 @@
   16.12          final CallSiteDescriptor desc = request.getCallSiteDescriptor();
   16.13          // We intercept "new" on StaticClass instances to provide additional capabilities
   16.14          if ("new".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) {
   16.15 +            // make sure new is on accessible Class
   16.16 +            Context.checkPackageAccess(receiverClass.getName());
   16.17 +
   16.18              // Is the class abstract? (This includes interfaces.)
   16.19              if (NashornLinker.isAbstractClass(receiverClass)) {
   16.20                  // Change this link request into a link request on the adapter class.
    17.1 --- a/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java	Wed Jul 24 08:25:04 2013 -0300
    17.2 +++ b/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java	Wed Jul 24 20:28:03 2013 +0530
    17.3 @@ -76,9 +76,10 @@
    17.4                  final CallSiteDescriptor desc = requestWithoutContext.getCallSiteDescriptor();
    17.5                  if(CallSiteDescriptorFactory.tokenizeOperators(desc).contains("getProp")) {
    17.6                      if ("static".equals(desc.getNameToken(CallSiteDescriptor.NAME_OPERAND))) {
    17.7 -                        Context.checkPackageAccess(((Class)self).getName());
    17.8 -                        // If "getProp:static" passes package access, allow access.
    17.9 -                        return;
   17.10 +                        if (Context.isAccessibleClass((Class<?>)self) && !isReflectionClass((Class<?>)self)) {
   17.11 +                            // If "getProp:static" passes access checks, allow access.
   17.12 +                            return;
   17.13 +                        }
   17.14                      }
   17.15                  }
   17.16              }
    18.1 --- a/test/script/sandbox/nashorninternals.js	Wed Jul 24 08:25:04 2013 -0300
    18.2 +++ b/test/script/sandbox/nashorninternals.js	Wed Jul 24 20:28:03 2013 +0530
    18.3 @@ -44,17 +44,25 @@
    18.4  
    18.5  // Not exhaustive - but a representative list of classes
    18.6  checkClass("jdk.nashorn.internal.codegen.Compiler");
    18.7 -checkClass("jdk.nashorn.internal.codegen.objects.MapCreator");
    18.8  checkClass("jdk.nashorn.internal.codegen.types.Type");
    18.9  checkClass("jdk.nashorn.internal.ir.Node");
   18.10  checkClass("jdk.nashorn.internal.ir.FunctionNode");
   18.11  checkClass("jdk.nashorn.internal.ir.debug.JSONWriter");
   18.12  checkClass("jdk.nashorn.internal.ir.visitor.NodeVisitor");
   18.13 +checkClass("jdk.nashorn.internal.lookup.MethodHandleFactory");
   18.14 +checkClass("jdk.nashorn.internal.objects.Global");
   18.15  checkClass("jdk.nashorn.internal.parser.AbstractParser");
   18.16  checkClass("jdk.nashorn.internal.parser.Parser");
   18.17  checkClass("jdk.nashorn.internal.parser.JSONParser");
   18.18  checkClass("jdk.nashorn.internal.parser.Lexer");
   18.19  checkClass("jdk.nashorn.internal.parser.Scanner");
   18.20 +checkClass("jdk.nashorn.internal.runtime.Context");
   18.21 +checkClass("jdk.nashorn.internal.runtime.arrays.ArrayData");
   18.22 +checkClass("jdk.nashorn.internal.runtime.linker.Bootstrap");
   18.23 +checkClass("jdk.nashorn.internal.runtime.options.Option");
   18.24 +checkClass("jdk.nashorn.internal.runtime.regexp.RegExp");
   18.25 +checkClass("jdk.nashorn.internal.scripts.JO");
   18.26 +checkClass("jdk.nashorn.tools.Shell");
   18.27  checkClass("jdk.internal.dynalink.CallSiteDescriptor");
   18.28  checkClass("jdk.internal.dynalink.beans.StaticClass");
   18.29  checkClass("jdk.internal.dynalink.linker.LinkRequest");
    19.1 --- a/test/script/trusted/JDK-8006529.js	Wed Jul 24 08:25:04 2013 -0300
    19.2 +++ b/test/script/trusted/JDK-8006529.js	Wed Jul 24 20:28:03 2013 +0530
    19.3 @@ -39,20 +39,21 @@
    19.4   * and FunctionNode because of package-access check and so reflective calls.
    19.5   */
    19.6  
    19.7 -var Parser              = Java.type("jdk.nashorn.internal.parser.Parser")
    19.8 -var Compiler            = Java.type("jdk.nashorn.internal.codegen.Compiler")
    19.9 -var Context             = Java.type("jdk.nashorn.internal.runtime.Context")
   19.10 -var ScriptEnvironment   = Java.type("jdk.nashorn.internal.runtime.ScriptEnvironment")
   19.11 -var Source              = Java.type("jdk.nashorn.internal.runtime.Source")
   19.12 -var FunctionNode        = Java.type("jdk.nashorn.internal.ir.FunctionNode")
   19.13 -var Block               = Java.type("jdk.nashorn.internal.ir.Block")
   19.14 -var VarNode             = Java.type("jdk.nashorn.internal.ir.VarNode")
   19.15 -var ExpressionStatement = Java.type("jdk.nashorn.internal.ir.ExpressionStatement")
   19.16 -var UnaryNode           = Java.type("jdk.nashorn.internal.ir.UnaryNode")
   19.17 -var BinaryNode          = Java.type("jdk.nashorn.internal.ir.BinaryNode")
   19.18 -var ThrowErrorManager   = Java.type("jdk.nashorn.internal.runtime.Context$ThrowErrorManager")
   19.19 -var ErrorManager        = Java.type("jdk.nashorn.internal.runtime.ErrorManager")
   19.20 -var Debug               = Java.type("jdk.nashorn.internal.runtime.Debug")
   19.21 +var forName = java.lang.Class["forName(String)"];
   19.22 +var Parser              = forName("jdk.nashorn.internal.parser.Parser").static
   19.23 +var Compiler            = forName("jdk.nashorn.internal.codegen.Compiler").static
   19.24 +var Context             = forName("jdk.nashorn.internal.runtime.Context").static
   19.25 +var ScriptEnvironment   = forName("jdk.nashorn.internal.runtime.ScriptEnvironment").static
   19.26 +var Source              = forName("jdk.nashorn.internal.runtime.Source").static
   19.27 +var FunctionNode        = forName("jdk.nashorn.internal.ir.FunctionNode").static
   19.28 +var Block               = forName("jdk.nashorn.internal.ir.Block").static
   19.29 +var VarNode             = forName("jdk.nashorn.internal.ir.VarNode").static
   19.30 +var ExpressionStatement = forName("jdk.nashorn.internal.ir.ExpressionStatement").static
   19.31 +var UnaryNode           = forName("jdk.nashorn.internal.ir.UnaryNode").static
   19.32 +var BinaryNode          = forName("jdk.nashorn.internal.ir.BinaryNode").static
   19.33 +var ThrowErrorManager   = forName("jdk.nashorn.internal.runtime.Context$ThrowErrorManager").static
   19.34 +var ErrorManager        = forName("jdk.nashorn.internal.runtime.ErrorManager").static
   19.35 +var Debug               = forName("jdk.nashorn.internal.runtime.Debug").static
   19.36  
   19.37  var parseMethod = Parser.class.getMethod("parse");
   19.38  var compileMethod = Compiler.class.getMethod("compile", FunctionNode.class);
    20.1 --- a/test/script/trusted/JDK-8021129.js	Wed Jul 24 08:25:04 2013 -0300
    20.2 +++ b/test/script/trusted/JDK-8021129.js	Wed Jul 24 20:28:03 2013 +0530
    20.3 @@ -29,9 +29,9 @@
    20.4   * @test
    20.5   * @run
    20.6   */
    20.7 -var R = Java.type("jdk.nashorn.internal.test.models.InternalRunnable")
    20.8 -var r1 = R.class.newInstance()
    20.9  
   20.10 +var InternalRunnableSuperclass = Java.type("jdk.nashorn.test.models.InternalRunnableSuperclass");
   20.11 +var r1 = InternalRunnableSuperclass.makeInternalRunnable();
   20.12  r1.run() // Can execute method from an implemented non-restricted interface
   20.13  print(r1.toString()) // Can execute public method from a superclass
   20.14  
   20.15 @@ -41,5 +41,5 @@
   20.16  print(r1.canSeeThisField === undefined) // Can't see fields from superclasses
   20.17  print(r1.canNotSeeThisField === undefined) // Can't see its own fields
   20.18  
   20.19 -var r2 = new (Java.type("jdk.nashorn.test.models.InternalRunnableSuperclass"))
   20.20 +var r2 = new InternalRunnableSuperclass();
   20.21  print(r2.canSeeThisField) // Superclass field works fine on its own
    21.1 --- a/test/script/trusted/JDK-8021189.js	Wed Jul 24 08:25:04 2013 -0300
    21.2 +++ b/test/script/trusted/JDK-8021189.js	Wed Jul 24 20:28:03 2013 +0530
    21.3 @@ -27,8 +27,9 @@
    21.4   * @test
    21.5   * @run
    21.6   */
    21.7 +var InternalRunnableSuperclass = Java.type("jdk.nashorn.test.models.InternalRunnableSuperclass");
    21.8  try {
    21.9 -    new (Java.type("jdk.nashorn.internal.test.models.InternalRunnable"))
   21.10 +    new (InternalRunnableSuperclass.getInternalRunnableType())();
   21.11  } catch(e) {
   21.12      print(e)
   21.13  }
    22.1 --- a/test/script/trusted/JDK-8021189.js.EXPECTED	Wed Jul 24 08:25:04 2013 -0300
    22.2 +++ b/test/script/trusted/JDK-8021189.js.EXPECTED	Wed Jul 24 20:28:03 2013 +0530
    22.3 @@ -1,1 +1,1 @@
    22.4 -TypeError: Can not construct jdk.nashorn.internal.test.models.InternalRunnable with the passed arguments; they do not match any of its constructor signatures.
    22.5 +java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.jdk.nashorn.internal.test.models")
    23.1 --- a/test/src/jdk/nashorn/test/models/InternalRunnableSuperclass.java	Wed Jul 24 08:25:04 2013 -0300
    23.2 +++ b/test/src/jdk/nashorn/test/models/InternalRunnableSuperclass.java	Wed Jul 24 20:28:03 2013 +0530
    23.3 @@ -25,6 +25,9 @@
    23.4  
    23.5  package jdk.nashorn.test.models;
    23.6  
    23.7 +import jdk.internal.dynalink.beans.StaticClass;
    23.8 +import jdk.nashorn.internal.test.models.InternalRunnable;
    23.9 +
   23.10  /**
   23.11   * Acts as a non-restricted superclass for a restricted class.
   23.12   *
   23.13 @@ -32,4 +35,11 @@
   23.14  public class InternalRunnableSuperclass {
   23.15      public final int canSeeThisField = 19;
   23.16  
   23.17 +    public static Object makeInternalRunnable() {
   23.18 +        return new InternalRunnable();
   23.19 +    }
   23.20 +
   23.21 +    public static StaticClass getInternalRunnableType() {
   23.22 +        return StaticClass.forClass(InternalRunnable.class);
   23.23 +    }
   23.24  }

mercurial