--- a/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Sat Apr 17 08:12:00 2010 -0700
+++ b/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Tue Apr 20 19:30:31 2010 +0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2010 Sun Microsystems, Inc. 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
@@ -77,26 +77,34 @@
if (DEBUG) err.printStackTrace();
return null;
}
- String gssLib = System.getProperty(LIB_PROP);
- if (gssLib == null || gssLib.trim().equals("")) {
+ String gssLibs[] = new String[0];
+ String defaultLib = System.getProperty(LIB_PROP);
+ if (defaultLib == null || defaultLib.trim().equals("")) {
String osname = System.getProperty("os.name");
if (osname.startsWith("SunOS")) {
- gssLib = "libgss.so";
+ gssLibs = new String[]{ "libgss.so" };
} else if (osname.startsWith("Linux")) {
- gssLib = "libgssapi.so";
+ gssLibs = new String[]{
+ "libgssapi.so",
+ "libgssapi_krb5.so",
+ };
}
+ } else {
+ gssLibs = new String[]{ defaultLib };
}
- if (GSSLibStub.init(gssLib)) {
- debug("Loaded GSS library: " + gssLib);
- Oid[] mechs = GSSLibStub.indicateMechs();
- HashMap<String, String> map =
- new HashMap<String, String>();
- for (int i = 0; i < mechs.length; i++) {
- debug("Native MF for " + mechs[i]);
- map.put("GssApiMechanism." + mechs[i],
- MF_CLASS);
+ for (String libName: gssLibs) {
+ if (GSSLibStub.init(libName)) {
+ debug("Loaded GSS library: " + libName);
+ Oid[] mechs = GSSLibStub.indicateMechs();
+ HashMap<String, String> map =
+ new HashMap<String, String>();
+ for (int i = 0; i < mechs.length; i++) {
+ debug("Native MF for " + mechs[i]);
+ map.put("GssApiMechanism." + mechs[i],
+ MF_CLASS);
+ }
+ return map;
}
- return map;
}
return null;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/Krb5NameEquals.java Tue Apr 20 19:30:31 2010 +0800
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2007-2010 Sun Microsystems, Inc. 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.
+ *
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @bug 4634392
+ * @summary JDK code doesn't respect contract for equals and hashCode
+ * @author Andrew Fan
+ */
+
+import org.ietf.jgss.*;
+
+public class Krb5NameEquals {
+
+ private static String NAME_STR1 = "service@host";
+ private static String NAME_STR2 = "service@host2";
+ private static final Oid MECH;
+
+ static {
+ Oid temp = null;
+ try {
+ temp = new Oid("1.2.840.113554.1.2.2"); // KRB5
+ } catch (Exception e) {
+ // should never happen
+ }
+ MECH = temp;
+ }
+
+ public static void main(String[] argv) throws Exception {
+ GSSManager mgr = GSSManager.getInstance();
+
+ boolean result = true;
+ // Create GSSName and check their equals(), hashCode() impl
+ GSSName name1 = mgr.createName(NAME_STR1,
+ GSSName.NT_HOSTBASED_SERVICE, MECH);
+ GSSName name2 = mgr.createName(NAME_STR2,
+ GSSName.NT_HOSTBASED_SERVICE, MECH);
+ GSSName name3 = mgr.createName(NAME_STR1,
+ GSSName.NT_HOSTBASED_SERVICE, MECH);
+
+ if (!name1.equals(name3) || !name1.equals(name3) ||
+ !name1.equals((Object) name1) ||
+ !name1.equals((Object) name3)) {
+ System.out.println("Error: should be the same name");
+ result = false;
+ } else if (name1.hashCode() != name3.hashCode()) {
+ System.out.println("Error: should have same hash");
+ result = false;
+ }
+
+ if (name1.equals(name2) || name1.equals((Object) name2)) {
+ System.out.println("Error: should be different names");
+ result = false;
+ }
+ if (result) {
+ System.out.println("Done");
+ } else System.exit(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/runNameEquals.sh Tue Apr 20 19:30:31 2010 +0800
@@ -0,0 +1,106 @@
+#
+# Copyright 2009-2010 Sun Microsystems, Inc. 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.
+#
+# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6317711 6944847
+# @summary Ensure the GSSName has the correct impl which respects
+# the contract for equals and hashCode across different configurations.
+
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC="."
+fi
+
+if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES="."
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute."
+ echo "FAILED!!!"
+ exit 1
+fi
+
+NATIVE=false
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ PATHSEP=":"
+ FILESEP="/"
+ NATIVE=true
+ ;;
+ Linux )
+ PATHSEP=":"
+ FILESEP="/"
+ NATIVE=true
+ ;;
+ CYGWIN* )
+ PATHSEP=";"
+ FILESEP="/"
+ ;;
+ Windows* )
+ PATHSEP=";"
+ FILESEP="\\"
+ ;;
+ * )
+ echo "Unrecognized system!"
+ exit 1;
+ ;;
+esac
+
+TEST=Krb5NameEquals
+
+${TESTJAVA}${FILESEP}bin${FILESEP}javac \
+ -d ${TESTCLASSES}${FILESEP} \
+ ${TESTSRC}${FILESEP}${TEST}.java
+
+EXIT_STATUS=0
+
+if [ "${NATIVE}" = "true" ] ; then
+ echo "Testing native provider"
+ ${TESTJAVA}${FILESEP}bin${FILESEP}java \
+ -classpath ${TESTCLASSES} \
+ -Dsun.security.jgss.native=true \
+ ${TEST}
+ if [ $? != 0 ] ; then
+ echo "Native provider fails"
+ EXIT_STATUS=1
+ fi
+fi
+
+echo "Testing java provider"
+${TESTJAVA}${FILESEP}bin${FILESEP}java \
+ -classpath ${TESTCLASSES} \
+ -Djava.security.krb5.realm=R \
+ -Djava.security.krb5.kdc=127.0.0.1 \
+ ${TEST}
+if [ $? != 0 ] ; then
+ echo "Java provider fails"
+ EXIT_STATUS=1
+fi
+
+exit ${EXIT_STATUS}