Hi, > On 11/3/17 6:52 PM, Bernd Eckenfels wrote: >> The private static helper in ObjectStreamClass became a oneliner and can be >> removed and the callsites can transform from getPackageName(c) to >> c.getPackageName(). > Good catch. we should clean that up. > Christoph - can you send a updated patch to remove > ObjectStreamClass::getPackageName and replace the calls with > Class::getPackageName and also remove VerifyAccess::getPackageName?
Please find the updated patch below. Cheers, Christoph ======= PATCH ======= diff -r 67aa34b019e1 src/java.base/share/classes/java/io/ObjectInputFilter.java --- a/src/java.base/share/classes/java/io/ObjectInputFilter.java Mon Nov 06 17:48:00 2017 -0800 +++ b/src/java.base/share/classes/java/io/ObjectInputFilter.java Tue Nov 07 15:44:36 2017 +0100 @@ -656,8 +656,8 @@ * otherwise {@code false} */ private static boolean matchesPackage(Class<?> c, String pkg) { - String n = c.getName(); - return n.startsWith(pkg) && n.lastIndexOf('.') == pkg.length() - 1; + String n = c.getPackageName(); + return n.length() == pkg.length() - 1 && n.startsWith(pkg); } /** diff -r 67aa34b019e1 src/java.base/share/classes/java/io/ObjectStreamClass.java --- a/src/java.base/share/classes/java/io/ObjectStreamClass.java Mon Nov 06 17:48:00 2017 -0800 +++ b/src/java.base/share/classes/java/io/ObjectStreamClass.java Tue Nov 07 15:44:36 2017 +0100 @@ -1580,18 +1580,7 @@ */ private static boolean packageEquals(Class<?> cl1, Class<?> cl2) { return (cl1.getClassLoader() == cl2.getClassLoader() && - getPackageName(cl1).equals(getPackageName(cl2))); - } - - /** - * Returns package name of given class. - */ - private static String getPackageName(Class<?> cl) { - String s = cl.getName(); - int i = s.lastIndexOf('['); - i = (i < 0) ? 0 : i + 2; - int j = s.lastIndexOf('.'); - return (i < j) ? s.substring(i, j) : ""; + cl1.getPackageName().equals(cl2.getPackageName())); } /** diff -r 67aa34b019e1 src/java.base/share/classes/java/lang/ClassLoader.java --- a/src/java.base/share/classes/java/lang/ClassLoader.java Mon Nov 06 17:48:00 2017 -0800 +++ b/src/java.base/share/classes/java/lang/ClassLoader.java Tue Nov 07 15:44:36 2017 +0100 @@ -675,12 +675,11 @@ return; } - final String name = cls.getName(); - final int i = name.lastIndexOf('.'); - if (i != -1) { + final String packageName = cls.getPackageName(); + if (!packageName.isEmpty()) { AccessController.doPrivileged(new PrivilegedAction<>() { public Void run() { - sm.checkPackageAccess(name.substring(0, i)); + sm.checkPackageAccess(packageName); return null; } }, new AccessControlContext(new ProtectionDomain[] {pd})); diff -r 67aa34b019e1 src/java.base/share/classes/java/lang/reflect/Proxy.java --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java Mon Nov 06 17:48:00 2017 -0800 +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java Tue Nov 07 15:44:36 2017 +0100 @@ -1034,11 +1034,8 @@ // do permission check if the caller is in a different runtime package // of the proxy class - int n = proxyClass.getName().lastIndexOf('.'); - String pkg = (n == -1) ? "" : proxyClass.getName().substring(0, n); - - n = caller.getName().lastIndexOf('.'); - String callerPkg = (n == -1) ? "" : caller.getName().substring(0, n); + String pkg = proxyClass.getPackageName(); + String callerPkg = caller.getPackageName(); if (pcl != ccl || !pkg.equals(callerPkg)) { sm.checkPermission(new ReflectPermission("newProxyInPackage." + pkg)); diff -r 67aa34b019e1 src/java.base/share/classes/sun/invoke/util/VerifyAccess.java --- a/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Mon Nov 06 17:48:00 2017 -0800 +++ b/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Tue Nov 07 15:44:36 2017 +0100 @@ -332,16 +332,6 @@ return Objects.equals(class1.getPackageName(), class2.getPackageName()); } - /** Return the package name for this class. - */ - public static String getPackageName(Class<?> cls) { - assert (!cls.isArray()); - String name = cls.getName(); - int dot = name.lastIndexOf('.'); - if (dot < 0) return ""; - return name.substring(0, dot); - } - /** * Test if two classes are defined as part of the same package member (top-level class). * If this is true, they can share private access with each other.