OSDN Git Service

2005-11-15 Andrew Haley <aph@redhat.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Nov 2005 17:34:11 +0000 (17:34 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Nov 2005 17:34:11 +0000 (17:34 +0000)
        * Merge from Classpath head:

   2005-09-16  Andrew Haley  <aph@redhat.com>

           * java/io/ObjectStreamClass.java (findAccessibleMethod): Allow
           protected readResolve().  Rewrite accessibility check.

   2005-07-07  Jeroen Frijters  <jeroen@frijters.net>

           * java/io/ObjectStreamClass.java
           (findAccessibleMethod): Added code to make method accessible.

   2005-07-03  Daniel Bonniot  <bonniot@users.sf.net>

           * java/io/ObjectStreamClass.java (inSamePackage): New private method.
           (findAccessibleMethod): Likewise.
           (cacheMethods): Lookup readResolve and writeReplace using the new
           findAccessibleMethod().

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107029 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/io/ObjectStreamClass.java

index 764b287..82b091b 100644 (file)
@@ -1,3 +1,24 @@
+2005-11-15  Andrew Haley  <aph@redhat.com>
+
+       * Merge from Classpath head:
+
+   2005-09-16  Andrew Haley  <aph@redhat.com>
+   
+           * java/io/ObjectStreamClass.java (findAccessibleMethod): Allow
+           protected readResolve().  Rewrite accessibility check.
+   
+   2005-07-07  Jeroen Frijters  <jeroen@frijters.net>
+   
+           * java/io/ObjectStreamClass.java
+           (findAccessibleMethod): Added code to make method accessible.
+   
+   2005-07-03  Daniel Bonniot  <bonniot@users.sf.net>
+   
+           * java/io/ObjectStreamClass.java (inSamePackage): New private method.
+           (findAccessibleMethod): Likewise.
+           (cacheMethods): Lookup readResolve and writeReplace using the new
+           findAccessibleMethod().
+   
 2005-11-14  Mohan Embar  <gnustuff@thisiscool.com>
 
        * java/net/natVMNetworkInterfaceWin32.cc: Include
index a292f0b..975dbfc 100644 (file)
@@ -486,19 +486,67 @@ outer:
     return null;
   }
 
+  private static boolean inSamePackage(Class c1, Class c2)
+  {
+    String name1 = c1.getName();
+    String name2 = c2.getName();
+
+    int id1 = name1.lastIndexOf('.');
+    int id2 = name2.lastIndexOf('.');
+
+    // Handle the default package
+    if (id1 == -1 || id2 == -1)
+      return id1 == id2;
+
+    String package1 = name1.substring(0, id1);
+    String package2 = name2.substring(0, id2);
+
+    return package1.equals(package2);
+  }
+
+  final static Class[] noArgs = new Class[0];
+
+  private static Method findAccessibleMethod(String name, Class from)
+  {
+    for (Class c = from; c != null; c = c.getSuperclass())
+      {
+       try
+         {
+           Method res = c.getDeclaredMethod(name, noArgs);
+           int mods = res.getModifiers();
+           
+           if (c == from  
+               || Modifier.isProtected(mods)
+               || Modifier.isPublic(mods)
+               || (! Modifier.isPrivate(mods) && inSamePackage(c, from)))
+             {
+               AccessController.doPrivileged(new SetAccessibleAction(res));
+               return res;
+             }
+         }
+       catch (NoSuchMethodException e)
+         {
+         }
+      }
+
+    return null;
+  }
+
   private void cacheMethods()
   {
     Method[] methods = forClass().getDeclaredMethods();
+
     readObjectMethod = findMethod(methods, "readObject",
                                  new Class[] { ObjectInputStream.class },
                                  Void.TYPE, true);
     writeObjectMethod = findMethod(methods, "writeObject",
                                    new Class[] { ObjectOutputStream.class },
                                    Void.TYPE, true);
-    readResolveMethod = findMethod(methods, "readResolve",
-                                  new Class[0], Object.class, false);
-    writeReplaceMethod = findMethod(methods, "writeReplace",
-                                    new Class[0], Object.class, false);
+
+    // readResolve and writeReplace can be in parent classes, as long as they
+    // are accessible from this class.
+    readResolveMethod = findAccessibleMethod("readResolve", forClass());
+    writeReplaceMethod = findAccessibleMethod("writeReplace", forClass());
   }
 
   private ObjectStreamClass(Class cl)