JDK 9 RFR of 8031067:java/util/concurrent/atomic/AtomicUpdaters.java: java.lang.Error: Unexpected reflective access

Chris Hegarty chris.hegarty at oracle.com
Mon Jan 6 11:44:19 UTC 2014


The test sets a security manager to ensure that appropriate permission 
checks are performed. It expects to be denied reflective access to a 
private field in a different package. Access, to this field, is granted 
if the code has RuntimePermission "accessDeclaredMembers". This 
permission is not expected, but the default policy implementation 
combines the java.home/lib/security/java.policy and 
user.home/.java.policy. So if a policy file, .java.policy, with 
RuntimePermission "accessDeclaredMembers", just happens to be in the 
users home directory when this test is run, it will fail as above.

The solution, trivially, is for the test to set its own policy, and 
remove any dependency on the default policy.

diff --git a/test/java/util/concurrent/atomic/AtomicUpdaters.java 
b/test/java/util/concurrent/atomic/AtomicUpdaters.java
--- a/test/java/util/concurrent/atomic/AtomicUpdaters.java
+++ b/test/java/util/concurrent/atomic/AtomicUpdaters.java
@@ -33,7 +33,7 @@
   */
  import java.util.concurrent.atomic.*;
  import java.lang.reflect.*;
-import java.security.AccessControlException;
+import java.security.*;

  public class  AtomicUpdaters {
      enum TYPE { INT, LONG, REF }
@@ -102,6 +102,8 @@
                  verbose = true;
              }
              else if ("UseSM".equals(arg)) {
+                // Ensure that the test is not influenced by the 
default users policy.
+                Policy.setPolicy(new NoPermissionsPolicy());
                  SecurityManager m = System.getSecurityManager();
                  if (m != null)
                      throw new RuntimeException("No security manager 
should initially be installed");
@@ -186,4 +188,24 @@
              throw new Error("Some tests failed - see previous 
stacktraces");
          }
      }
+
+    /**
+     * Policy with no permissions.
+     */
+    private static class NoPermissionsPolicy extends Policy {
+        @Override
+        public PermissionCollection getPermissions(CodeSource cs) {
+            return Policy.UNSUPPORTED_EMPTY_COLLECTION;
+        }
+
+        @Override
+        public PermissionCollection getPermissions(ProtectionDomain pd) {
+            return Policy.UNSUPPORTED_EMPTY_COLLECTION;
+        }
+
+        @Override
+        public boolean implies(ProtectionDomain pd, Permission p) {
+            return Policy.UNSUPPORTED_EMPTY_COLLECTION.implies(p);
+        }
+    }
  }

-Chris.



More information about the core-libs-dev mailing list