From 2dfedb225bcc487b2a1a3ce6a73ad9a359f7a493 Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Tue, 15 Nov 2005 17:34:11 +0000 Subject: [PATCH] [multiple changes] 2005-11-15 Andrew Haley * Merge from Classpath head: 2005-09-16 Andrew Haley * java/io/ObjectStreamClass.java (findAccessibleMethod): Allow protected readResolve(). Rewrite accessibility check. 2005-07-07 Jeroen Frijters * java/io/ObjectStreamClass.java (findAccessibleMethod): Added code to make method accessible. 2005-07-03 Daniel Bonniot * java/io/ObjectStreamClass.java (inSamePackage): New private method. (findAccessibleMethod): Likewise. (cacheMethods): Lookup readResolve and writeReplace using the new findAccessibleMethod(). From-SVN: r107029 --- libjava/ChangeLog | 21 ++++++++++ libjava/java/io/ObjectStreamClass.java | 56 ++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 764b287c1ed..82b091b9153 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,24 @@ +2005-11-15 Andrew Haley + + * Merge from Classpath head: + + 2005-09-16 Andrew Haley + + * java/io/ObjectStreamClass.java (findAccessibleMethod): Allow + protected readResolve(). Rewrite accessibility check. + + 2005-07-07 Jeroen Frijters + + * java/io/ObjectStreamClass.java + (findAccessibleMethod): Added code to make method accessible. + + 2005-07-03 Daniel Bonniot + + * java/io/ObjectStreamClass.java (inSamePackage): New private method. + (findAccessibleMethod): Likewise. + (cacheMethods): Lookup readResolve and writeReplace using the new + findAccessibleMethod(). + 2005-11-14 Mohan Embar * java/net/natVMNetworkInterfaceWin32.cc: Include diff --git a/libjava/java/io/ObjectStreamClass.java b/libjava/java/io/ObjectStreamClass.java index a292f0b5ffc..975dbfc66d0 100644 --- a/libjava/java/io/ObjectStreamClass.java +++ b/libjava/java/io/ObjectStreamClass.java @@ -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)