7019384: Realm.getRealmsList returns realms list in wrong (reverse) order
authorweijun
Mon, 28 Mar 2011 18:04:10 +0800
changeset 9007 05f25362fb76
parent 9006 49dc728cdd3e
child 9008 1c23e333dd76
7019384: Realm.getRealmsList returns realms list in wrong (reverse) order Reviewed-by: xuelei
jdk/src/share/classes/sun/security/krb5/Realm.java
jdk/test/sun/security/krb5/ParseCAPaths.java
jdk/test/sun/security/krb5/krb5-capaths.conf
--- a/jdk/src/share/classes/sun/security/krb5/Realm.java	Fri Mar 25 18:47:57 2011 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/Realm.java	Mon Mar 28 18:04:10 2011 +0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2011, 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
@@ -362,19 +362,15 @@
         Stack<String> iStack = new Stack<>();
 
         /*
-         * I don't expect any more than a handful of intermediaries.
+         * The half-established reversed-path, starting from the final target
+         * (sRealm), each item can be connected to by the next one.
+         * Might contains wrong item, if found, a bad track is performed
          */
         Vector<String> tempList = new Vector<>(8, 8);
-
-        /*
-         * The initiator at first location.
-         */
-        tempList.add(cRealm);
+        tempList.add(sRealm);
 
         int count = 0; // For debug only
-        if (DEBUG) {
-            tempTarget = sRealm;
-        }
+        tempTarget = sRealm;
 
         out: do {
             if (DEBUG) {
@@ -384,8 +380,8 @@
             }
 
             if (intermediaries != null &&
-                !intermediaries.equals(PrincipalName.REALM_COMPONENT_SEPARATOR_STR))
-            {
+                !intermediaries.equals(".") &&
+                !intermediaries.equals(cRealm)) {
                 if (DEBUG) {
                     System.out.println(">>> Realm parseCapaths: loop " +
                                        count + ": intermediaries=[" +
@@ -466,11 +462,15 @@
 
         } while (true);
 
+        if (tempList.isEmpty()) {
+            return null;
+        }
+
+        // From (SREALM, T1, T2) to (CREALM, T2, T1)
         retList = new String[tempList.size()];
-        try {
-            retList = tempList.toArray(retList);
-        } catch (ArrayStoreException exc) {
-            retList = null;
+        retList[0] = cRealm;
+        for (int i=1; i<tempList.size(); i++) {
+            retList[i] = tempList.elementAt(tempList.size()-i);
         }
 
         if (DEBUG && retList != null) {
--- a/jdk/test/sun/security/krb5/ParseCAPaths.java	Fri Mar 25 18:47:57 2011 -0700
+++ b/jdk/test/sun/security/krb5/ParseCAPaths.java	Mon Mar 28 18:04:10 2011 +0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011, 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
@@ -23,6 +23,7 @@
 /*
  * @test
  * @bug 6789935
+ * @run main/othervm ParseCAPaths
  * @summary cross-realm capath search error
  */
 
@@ -30,9 +31,10 @@
 import sun.security.krb5.Realm;
 
 public class ParseCAPaths {
-    static boolean failed = false;
+    static Exception failed = null;
     public static void main(String[] args) throws Exception {
-        System.setProperty("java.security.krb5.conf", System.getProperty("test.src", ".") +"/krb5-capaths.conf");
+        System.setProperty("java.security.krb5.conf",
+                System.getProperty("test.src", ".") +"/krb5-capaths.conf");
         //System.setProperty("sun.security.krb5.debug", "true");
 
         // Standard example
@@ -59,9 +61,13 @@
         check("G1.COM", "G3.COM", "G1.COM", "COM");
         check("H1.COM", "H3.COM", "H1.COM");
         check("I1.COM", "I4.COM", "I1.COM", "I5.COM");
-
-        if (failed) {
-            throw new Exception("Failed somewhere.");
+        // J2=J1 is the same as J2=.
+        check("J1.COM", "J2.COM", "J1.COM");
+        // 7019384
+        check("A9.PRAGUE.XXX.CZ", "SERVIS.XXX.CZ",
+                "A9.PRAGUE.XXX.CZ", "PRAGUE.XXX.CZ", "ROOT.XXX.CZ");
+        if (failed != null) {
+            throw failed;
         }
     }
 
@@ -69,10 +75,10 @@
         try {
             check2(from, to, paths);
         } catch (Exception e) {
-            failed = true;
-            e.printStackTrace();
+            failed = e;
         }
     }
+
     static void check2(String from, String to, String... paths)
             throws Exception {
         System.out.println(from + " -> " + to);
--- a/jdk/test/sun/security/krb5/krb5-capaths.conf	Fri Mar 25 18:47:57 2011 -0700
+++ b/jdk/test/sun/security/krb5/krb5-capaths.conf	Mon Mar 28 18:04:10 2011 +0800
@@ -85,3 +85,13 @@
     I3.COM = I2.COM
     I4.COM = I2.COM I5.COM
 }
+
+J1.COM = {
+    J2.COM=J1.COM
+}
+
+A9.PRAGUE.XXX.CZ = {
+    PRAGUE.XXX.CZ = .
+    ROOT.XXX.CZ = PRAGUE.XXX.CZ
+    SERVIS.XXX.CZ = ROOT.XXX.CZ
+}