8129575: Equal DelegationPermission instances may return different hash codes
Reviewed-by: mullan, weijun
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Thu Jun 25 09:03:23 2015 +0800
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Thu Jun 25 20:20:41 2015 +0800
@@ -140,37 +140,32 @@
*/
@Override
public boolean implies(Permission p) {
- if (!(p instanceof DelegationPermission))
- return false;
-
- DelegationPermission that = (DelegationPermission) p;
- if (this.subordinate.equals(that.subordinate) &&
- this.service.equals(that.service))
- return true;
-
- return false;
+ return equals(p);
}
-
/**
* Checks two DelegationPermission objects for equality.
*
* @param obj the object to test for equality with this object.
*
* @return true if {@code obj} is a DelegationPermission, and
- * has the same subordinate and service principal as this.
+ * has the same subordinate and service principal as this
* DelegationPermission object.
*/
@Override
public boolean equals(Object obj) {
- if (obj == this)
+ if (obj == this) {
return true;
+ }
- if (! (obj instanceof DelegationPermission))
+ if (!(obj instanceof DelegationPermission)) {
return false;
+ }
DelegationPermission that = (DelegationPermission) obj;
- return implies(that);
+
+ return this.subordinate.equals(that.subordinate) &&
+ this.service.equals(that.service);
}
/**
@@ -180,7 +175,7 @@
*/
@Override
public int hashCode() {
- return getName().hashCode();
+ return 17 * subordinate.hashCode() + 31 * service.hashCode();
}
/**
@@ -223,42 +218,6 @@
init(getName());
}
- /*
- public static void main(String args[]) throws Exception {
- DelegationPermission this_ =
- new DelegationPermission(args[0]);
- DelegationPermission that_ =
- new DelegationPermission(args[1]);
- System.out.println("-----\n");
- System.out.println("this.implies(that) = " + this_.implies(that_));
- System.out.println("-----\n");
- System.out.println("this = "+this_);
- System.out.println("-----\n");
- System.out.println("that = "+that_);
- System.out.println("-----\n");
-
- KrbDelegationPermissionCollection nps =
- new KrbDelegationPermissionCollection();
- nps.add(this_);
- nps.add(new DelegationPermission("\"host/foo.example.com@EXAMPLE.COM\" \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
- try {
- nps.add(new DelegationPermission("host/foo.example.com@EXAMPLE.COM \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
- } catch (Exception e) {
- System.err.println(e);
- }
-
- System.out.println("nps.implies(that) = " + nps.implies(that_));
- System.out.println("-----\n");
-
- Enumeration e = nps.elements();
-
- while (e.hasMoreElements()) {
- DelegationPermission x =
- (DelegationPermission) e.nextElement();
- System.out.println("nps.e = " + x);
- }
- }
- */
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/DelegationPermissionHash.java Thu Jun 25 20:20:41 2015 +0800
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.security.auth.kerberos.DelegationPermission;
+
+/*
+ * @test
+ * @bug 8129575
+ * @summary Checks if DelegationPermission.hashCode() works fine
+ */
+public class DelegationPermissionHash {
+
+ static final String princ1 = "backup/bar.example.com@EXAMPLE.COM";
+ static final String princ2 = "backup/foo.example.com@EXAMPLE.COM";
+ static final String ONE_SPACE = " ";
+ static final String TWO_SPACES = " ";
+ static final String QUOTE = "\"";
+
+ public static void main(String[] args) {
+ DelegationPermission one = new DelegationPermission(
+ QUOTE + princ1 + QUOTE + ONE_SPACE + QUOTE + princ2 + QUOTE);
+ DelegationPermission two = new DelegationPermission(
+ QUOTE + princ1 + QUOTE + TWO_SPACES + QUOTE + princ2 + QUOTE);
+
+ System.out.println("one.getName() = " + one.getName());
+ System.out.println("two.getName() = " + two.getName());
+
+ if (!one.implies(two) || !two.implies(one)) {
+ throw new RuntimeException("Test failed: "
+ + "one and two don't imply each other");
+ }
+
+ if (!one.equals(two)) {
+ throw new RuntimeException("Test failed: one is not equal to two");
+ }
+
+ System.out.println("one.hashCode() = " + one.hashCode());
+ System.out.println("two.hashCode() = " + two.hashCode());
+ if (one.hashCode() != two.hashCode()) {
+ throw new RuntimeException("Test failed: hash codes are not equal");
+ }
+
+ System.out.println("Test passed");
+ }
+}