OSDN Git Service

Fixing Unsafe.getUnsafe() to look up the stack the correct number of frames.
authorJesse Wilson <jessewilson@google.com>
Wed, 19 Aug 2009 00:21:31 +0000 (17:21 -0700)
committerJesse Wilson <jessewilson@google.com>
Wed, 19 Aug 2009 00:21:31 +0000 (17:21 -0700)
Also tests for Unsafe.getUnsafe() and all the requisite AllTests files
to make that show up in the continuous build.

libcore/luni/src/test/java/tests/AllTests.java
libcore/suncompat/src/main/java/sun/misc/Unsafe.java
libcore/suncompat/src/test/java/sun/misc/AllTests.java [new file with mode: 0644]
libcore/suncompat/src/test/java/sun/misc/UnsafeTest.java [new file with mode: 0644]
libcore/suncompat/src/test/java/tests/suncompat/AllTests.java [new file with mode: 0644]

index 9ef1aa8..26e58c1 100644 (file)
@@ -49,6 +49,7 @@ public class AllTests
         suite.addTest(tests.regex.AllTests.suite());
         suite.addTest(tests.security.AllTests.suite());
         suite.addTest(tests.sql.AllTests.suite());
+        suite.addTest(tests.suncompat.AllTests.suite());
         suite.addTest(tests.text.AllTests.suite());
         suite.addTest(tests.xml.AllTests.suite());
         suite.addTest(tests.xnet.AllTests.suite());
index e880af2..6ae572f 100644 (file)
@@ -52,9 +52,7 @@ public final class Unsafe {
          * Only code on the bootclasspath is allowed to get at the
          * Unsafe instance.
          */
-        ClassLoader calling = VMStack.getCallingClassLoader2();
-        ClassLoader current = Unsafe.class.getClassLoader();
-
+        ClassLoader calling = VMStack.getCallingClassLoader();
         if ((calling != null) && (calling != Unsafe.class.getClassLoader())) {
             throw new SecurityException("Unsafe access denied");
         }
diff --git a/libcore/suncompat/src/test/java/sun/misc/AllTests.java b/libcore/suncompat/src/test/java/sun/misc/AllTests.java
new file mode 100644 (file)
index 0000000..8ea3bcf
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sun.misc;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests {
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(AllTests.suite());
+    }
+
+    public static Test suite() {
+        TestSuite suite = tests.TestSuiteFactory.createTestSuite("Test for sun.misc");
+
+        // $JUnit-BEGIN$
+
+        suite.addTestSuite(UnsafeTest.class);
+
+        // $JUnit-END$
+
+        return suite;
+    }
+}
diff --git a/libcore/suncompat/src/test/java/sun/misc/UnsafeTest.java b/libcore/suncompat/src/test/java/sun/misc/UnsafeTest.java
new file mode 100644 (file)
index 0000000..338055b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sun.misc;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import junit.framework.TestCase;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+
+@TestTargetClass(Unsafe.class)
+public class UnsafeTest extends TestCase {
+
+    @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            notes = "",
+            method = "getUnsafe",
+            args = {}
+    )
+    public void test_getUnsafeForbidden() {
+        try {
+            Unsafe.getUnsafe();
+            fail();
+        } catch (SecurityException expected) {
+        }
+    }
+
+    /**
+     * Regression for 2053217. We used to look one level higher than necessary
+     * on the stack.
+     */
+    @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            notes = "",
+            method = "getUnsafe",
+            args = {}
+    )
+    public void test_getUnsafeForbiddenWithSystemCaller() throws Exception {
+        Callable<Object> callable = Executors.callable(new Runnable() {
+            public void run() {
+                Unsafe.getUnsafe();
+            }
+        });
+
+        try {
+            callable.call();
+            fail();
+        } catch (SecurityException expected) {
+        }
+    }
+}
diff --git a/libcore/suncompat/src/test/java/tests/suncompat/AllTests.java b/libcore/suncompat/src/test/java/tests/suncompat/AllTests.java
new file mode 100644 (file)
index 0000000..0884517
--- /dev/null
@@ -0,0 +1,38 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.suncompat;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Test suite that includes all tests for the suncompat project.
+ */
+public class AllTests {
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(AllTests.suite());
+    }
+
+    public static Test suite() {
+        TestSuite suite = tests.TestSuiteFactory.createTestSuite("All suncompat test suites");
+        // $JUnit-BEGIN$
+        suite.addTest(sun.misc.AllTests.suite());
+        // $JUnit-END$
+        return suite;
+    }
+}