* src/vmcore/class.c (class_sun_reflect_MagicAccessorImpl): Added.
authortwisti <none@none>
Fri, 27 Jul 2007 16:15:29 +0000 (16:15 +0000)
committertwisti <none@none>
Fri, 27 Jul 2007 16:15:29 +0000 (16:15 +0000)
(class_issubclass): Don't get super-class directly, it can be
unresolved. Use class_get_superclass.

* src/vmcore/class.h (class_sun_reflect_MagicAccessorImpl): Added.

* src/vmcore/loader.c (loader_init): Load
class_sun_reflect_MagicAccessorImpl.

* src/vmcore/linker.c (linker_init): Link
class_sun_reflect_MagicAccessorImpl.

* src/vm/access.c (access_is_accessible_class) [WITH_CLASSPATH_SUN]:
Added sun/reflect/MagicAccessorImpl check.
(access_is_accessible_member): Likewise.

src/vm/access.c
src/vmcore/class.c
src/vmcore/class.h
src/vmcore/linker.c
src/vmcore/loader.c

index b01d7d2c4ce9b76faf0c23f8a3b206dcf510e962..70acfc38e9d2b567b41f3f0f916d4ca7913d13ca 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: access.c 7976 2007-05-29 12:22:55Z twisti $
+   $Id: access.c 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -75,17 +75,31 @@ bool access_is_accessible_class(classinfo *referer, classinfo *cls)
        assert(referer);
        assert(cls);
 
-       /* public classes are always accessible */
+       /* Public classes are always accessible. */
 
        if (cls->flags & ACC_PUBLIC)
                return true;
 
-       /* a class in the same package is always accessible */
+       /* A class in the same package is always accessible. */
 
        if (SAME_PACKAGE(referer, cls))
                return true;
 
-       /* a non-public class in another package is not accessible */
+#if defined(WITH_CLASSPATH_SUN)
+       /* Code for Sun's OpenJDK (see
+          hotspot/src/share/vm/runtime/reflection.cpp
+          (Reflection::verify_class_access)): Allow all accesses from
+          sun/reflect/MagicAccessorImpl subclasses to succeed
+          trivially. */
+
+       /* NOTE: This check must be before checks that could return
+          false. */
+
+       if (class_issubclass(cls, class_sun_reflect_MagicAccessorImpl))
+               return true;
+#endif
+
+       /* A non-public class in another package is not accessible. */
 
        return false;
 }
@@ -120,12 +134,26 @@ bool access_is_accessible_member(classinfo *referer, classinfo *declarer,
 {
        assert(referer);
        assert(declarer);
-       
-       /* public members are accessible */
+
+       /* Public members are accessible. */
 
        if (memberflags & ACC_PUBLIC)
                return true;
 
+#if defined(WITH_CLASSPATH_SUN)
+       /* Code for Sun's OpenJDK (see
+          hotspot/src/share/vm/runtime/reflection.cpp
+          (Reflection::verify_class_access)): Allow all accesses from
+          sun/reflect/MagicAccessorImpl subclasses to succeed
+          trivially. */
+
+       /* NOTE: This check must be before checks that could return
+          false. */
+
+       if (class_issubclass(declarer, class_sun_reflect_MagicAccessorImpl))
+               return true;
+#endif
+
        /* {declarer is not an interface} */
 
        /* private members are only accessible by the class itself */
index 48e8ff42de2c186bbd6b6ecfe581ee659be9d4ee..e85e2a71aca3b4d9c1e81c8ce19a5a37245f86d5 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.c 8231 2007-07-25 14:21:24Z twisti $
+   $Id: class.c 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -82,6 +82,9 @@ classinfo *class_java_lang_VMSystem;
 classinfo *class_java_lang_VMThread;
 classinfo *class_java_io_Serializable;
 
+#if defined(WITH_CLASSPATH_SUN)
+classinfo *class_sun_reflect_MagicAccessorImpl;
+#endif
 
 /* system exception classes required in cacao */
 
@@ -1460,15 +1463,11 @@ fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
 
 bool class_issubclass(classinfo *sub, classinfo *super)
 {
-       for (;;) {
-               if (!sub)
-                       return false;
-
+       for (; sub != NULL; sub = class_get_superclass(sub))
                if (sub == super)
                        return true;
 
-               sub = sub->super.cls;
-       }
+       return false;
 }
 
 
index 85d2590ecbf23f0fea200b560516f3b5682641b1..e201ce127fd0f0332e1beca035401611af0992da 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.h 8231 2007-07-25 14:21:24Z twisti $
+   $Id: class.h 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -204,6 +204,9 @@ extern classinfo *class_java_lang_VMSystem;
 extern classinfo *class_java_lang_VMThread;
 extern classinfo *class_java_io_Serializable;
 
+#if defined(WITH_CLASSPATH_SUN)
+extern classinfo *class_sun_reflect_MagicAccessorImpl;
+#endif
 
 /* system exception classes required in cacao */
 
index cc71c70acabb34ddedda9e1744d8a59e8d06a598..f97f00d6aaa73d191d90288965ea62a3703fef1a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: linker.c 8234 2007-07-26 08:21:25Z twisti $
+   $Id: linker.c 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -174,7 +174,6 @@ bool linker_init(void)
                return false;
 #endif
 
-
        /* link classes for wrapping primitive types */
 
 #if defined(ENABLE_JAVASE)
@@ -258,6 +257,11 @@ bool linker_init(void)
        if (!link_class(class_java_util_Vector))
                return false;
 
+# if defined(WITH_CLASSPATH_SUN)
+       if (!link_class(class_sun_reflect_MagicAccessorImpl))
+               return false;
+# endif
+
        if (!link_class(arrayclass_java_lang_Object))
                return false;
 #endif
index 9962c2c7d6ff6a40b654c9a702ca7b1cc8c6acec..2c18f2967029acf608e21b62f79fc49e0b8d4071 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: loader.c 8230 2007-07-25 08:23:10Z twisti $
+   $Id: loader.c 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -217,6 +217,12 @@ bool loader_init(void)
        if (!(class_java_util_Vector = load_class_bootstrap(utf_java_util_Vector)))
                return false;
 
+# if defined(WITH_CLASSPATH_SUN)
+       if (!(class_sun_reflect_MagicAccessorImpl =
+                 load_class_bootstrap(utf_new_char("sun/reflect/MagicAccessorImpl"))))
+               return false;
+# endif
+
        if (!(arrayclass_java_lang_Object =
                  load_class_bootstrap(utf_new_char("[Ljava/lang/Object;"))))
                return false;