changeset 1528:baec332a0ff4

Merge
author asaha
date Mon, 27 Jul 2009 22:28:29 -0700
parents 14c81c80a7f3 056c8e724015
children ebc7d26588b8
files
diffstat 44 files changed, 1321 insertions(+), 324 deletions(-) [+]
line wrap: on
line diff
--- a/make/common/shared/Defs-control.gmk	Tue Jul 21 13:06:30 2009 -0700
+++ b/make/common/shared/Defs-control.gmk	Mon Jul 27 22:28:29 2009 -0700
@@ -92,9 +92,9 @@
 dummy := $(shell $(MKDIR) -p $(TEMP_DIR))
 
 # The language version we want for this jdk build
-SOURCE_LANGUAGE_VERSION=5
+SOURCE_LANGUAGE_VERSION=7
 # The class version we want for this jdk build
-TARGET_CLASS_VERSION=5
+TARGET_CLASS_VERSION=7
 
 # The MESSAGE, WARNING and ERROR files are used to store sanity check and 
 # source check messages, warnings and errors. 
--- a/make/common/shared/Defs-java.gmk	Tue Jul 21 13:06:30 2009 -0700
+++ b/make/common/shared/Defs-java.gmk	Mon Jul 27 22:28:29 2009 -0700
@@ -122,13 +122,13 @@
   JAVACFLAGS  += -Werror
 endif
 
-# Add the source level (currently all source is 1.5, should this be 1.6?)
-SOURCE_LANGUAGE_VERSION = 5
+# Add the source level
+SOURCE_LANGUAGE_VERSION = 7
 LANGUAGE_VERSION = -source $(SOURCE_LANGUAGE_VERSION)
 JAVACFLAGS  += $(LANGUAGE_VERSION)
 
-# Add the class version we want (currently this is 5, should it be 6 or even 7?)
-TARGET_CLASS_VERSION = 5
+# Add the class version we want
+TARGET_CLASS_VERSION = 7
 CLASS_VERSION = -target $(TARGET_CLASS_VERSION)
 JAVACFLAGS  += $(CLASS_VERSION)
 JAVACFLAGS  += -encoding ascii
--- a/make/java/dyn/Makefile	Tue Jul 21 13:06:30 2009 -0700
+++ b/make/java/dyn/Makefile	Mon Jul 27 22:28:29 2009 -0700
@@ -33,8 +33,8 @@
 
 # The sources built here use new language syntax to generate
 # method handle calls.  Let's be sure we are using that format.
-#LANGUAGE_VERSION = -source 7
-#CLASS_VERSION = -target 7
+LANGUAGE_VERSION = -source 7
+CLASS_VERSION = -target 7
 
 # Actually, it will be less disruptive to compile with the same
 # -target option as the rest of the system, and just turn on
--- a/src/share/classes/com/sun/jndi/ldap/Filter.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/com/sun/jndi/ldap/Filter.java	Mon Jul 27 22:28:29 2009 -0700
@@ -93,9 +93,7 @@
 
         int filtOffset[] = new int[1];
 
-        for (filtOffset[0] = filterStart;
-             filtOffset[0] < filterEnd;
-             filtOffset[0]++) {
+        for (filtOffset[0] = filterStart; filtOffset[0] < filterEnd;) {
             switch (filter[filtOffset[0]]) {
             case '(':
                 filtOffset[0]++;
@@ -104,18 +102,21 @@
                 case '&':
                     encodeComplexFilter(ber, filter,
                         LDAP_FILTER_AND, filtOffset, filterEnd);
+                    // filtOffset[0] has pointed to char after right paren
                     parens--;
                     break;
 
                 case '|':
                     encodeComplexFilter(ber, filter,
                         LDAP_FILTER_OR, filtOffset, filterEnd);
+                    // filtOffset[0] has pointed to char after right paren
                     parens--;
                     break;
 
                 case '!':
                     encodeComplexFilter(ber, filter,
                         LDAP_FILTER_NOT, filtOffset, filterEnd);
+                    // filtOffset[0] has pointed to char after right paren
                     parens--;
                     break;
 
@@ -143,8 +144,8 @@
 
                     encodeSimpleFilter(ber, filter, filtOffset[0], nextOffset);
 
-                    // points to right parens; for loop will increment beyond parens
-                    filtOffset[0] = nextOffset;
+                    // points to the char after right paren.
+                    filtOffset[0] = nextOffset + 1;
 
                     parens--;
                     break;
@@ -170,9 +171,14 @@
                 filtOffset[0] = filterEnd; // force break from outer
                 break;
             }
+
+            if (parens < 0) {
+                throw new InvalidSearchFilterException(
+                                                "Unbalanced parenthesis");
+            }
         }
 
-        if (parens > 0) {
+        if (parens != 0) {
             throw new InvalidSearchFilterException("Unbalanced parenthesis");
         }
 
--- a/src/share/classes/java/lang/Character.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/java/lang/Character.java	Mon Jul 27 22:28:29 2009 -0700
@@ -2784,8 +2784,13 @@
      * @since  1.5
      */
     public static int toCodePoint(char high, char low) {
-        return ((high - MIN_HIGH_SURROGATE) << 10)
-            + (low - MIN_LOW_SURROGATE) + MIN_SUPPLEMENTARY_CODE_POINT;
+        // Optimized form of:
+        // return ((high - MIN_HIGH_SURROGATE) << 10)
+        //         + (low - MIN_LOW_SURROGATE)
+        //         + MIN_SUPPLEMENTARY_CODE_POINT;
+        return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
+                                       - (MIN_HIGH_SURROGATE << 10)
+                                       - MIN_LOW_SURROGATE);
     }
 
     /**
@@ -3071,9 +3076,10 @@
     }
 
     static void toSurrogates(int codePoint, char[] dst, int index) {
-        int offset = codePoint - MIN_SUPPLEMENTARY_CODE_POINT;
-        dst[index+1] = (char)((offset & 0x3ff) + MIN_LOW_SURROGATE);
-        dst[index] = (char)((offset >>> 10) + MIN_HIGH_SURROGATE);
+        // We write elements "backwards" to guarantee all-or-nothing
+        dst[index+1] = (char)((codePoint & 0x3ff) + MIN_LOW_SURROGATE);
+        dst[index] = (char)((codePoint >>> 10)
+            + (MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
     }
 
     /**
--- a/src/share/classes/java/util/logging/LogManager.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/java/util/logging/LogManager.java	Mon Jul 27 22:28:29 2009 -0700
@@ -338,7 +338,7 @@
     // already been created with the given name it is returned.
     // Otherwise a new logger instance is created and registered
     // in the LogManager global namespace.
-    synchronized Logger demandLogger(String name) {
+    Logger demandLogger(String name) {
         Logger result = getLogger(name);
         if (result == null) {
             result = new Logger(name, null);
--- a/src/share/classes/sun/nio/cs/Surrogate.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/nio/cs/Surrogate.java	Mon Jul 27 22:28:29 2009 -0700
@@ -30,7 +30,6 @@
 import java.nio.charset.MalformedInputException;
 import java.nio.charset.UnmappableCharacterException;
 
-
 /**
  * Utility class for dealing with surrogates.
  *
@@ -41,19 +40,15 @@
 
     private Surrogate() { }
 
-    // UTF-16 surrogate-character ranges
-    //
-    public static final char MIN_HIGH = '\uD800';
-    public static final char MAX_HIGH = '\uDBFF';
-    public static final char MIN_LOW  = '\uDC00';
-    public static final char MAX_LOW  = '\uDFFF';
-    public static final char MIN = MIN_HIGH;
-    public static final char MAX = MAX_LOW;
-
-    // Range of UCS-4 values that need surrogates in UTF-16
-    //
-    public static final int UCS4_MIN = 0x10000;
-    public static final int UCS4_MAX = (1 << 20) + UCS4_MIN - 1;
+    // TODO: Deprecate/remove the following redundant definitions
+    public static final char MIN_HIGH = Character.MIN_HIGH_SURROGATE;
+    public static final char MAX_HIGH = Character.MAX_HIGH_SURROGATE;
+    public static final char MIN_LOW  = Character.MIN_LOW_SURROGATE;
+    public static final char MAX_LOW  = Character.MAX_LOW_SURROGATE;
+    public static final char MIN      = Character.MIN_SURROGATE;
+    public static final char MAX      = Character.MAX_SURROGATE;
+    public static final int UCS4_MIN  = Character.MIN_SUPPLEMENTARY_CODE_POINT;
+    public static final int UCS4_MAX  = Character.MAX_CODE_POINT;
 
     /**
      * Tells whether or not the given UTF-16 value is a high surrogate.
@@ -77,35 +72,45 @@
     }
 
     /**
+     * Tells whether or not the given UCS-4 character is in the Basic
+     * Multilingual Plane, and can be represented using a single char.
+     */
+    public static boolean isBMP(int uc) {
+        return (int) (char) uc == uc;
+    }
+
+    /**
      * Tells whether or not the given UCS-4 character must be represented as a
      * surrogate pair in UTF-16.
      */
     public static boolean neededFor(int uc) {
-        return (uc >= UCS4_MIN) && (uc <= UCS4_MAX);
+        return Character.isSupplementaryCodePoint(uc);
     }
 
     /**
      * Returns the high UTF-16 surrogate for the given UCS-4 character.
      */
     public static char high(int uc) {
-        assert neededFor(uc);
-        return (char)(0xd800 | (((uc - UCS4_MIN) >> 10) & 0x3ff));
+        assert Character.isSupplementaryCodePoint(uc);
+        return (char)((uc >> 10)
+                      + (Character.MIN_HIGH_SURROGATE
+                         - (Character.MIN_SUPPLEMENTARY_CODE_POINT >> 10)));
     }
 
     /**
      * Returns the low UTF-16 surrogate for the given UCS-4 character.
      */
     public static char low(int uc) {
-        assert neededFor(uc);
-        return (char)(0xdc00 | ((uc - UCS4_MIN) & 0x3ff));
+        assert Character.isSupplementaryCodePoint(uc);
+        return (char)((uc & 0x3ff) + Character.MIN_LOW_SURROGATE);
     }
 
     /**
      * Converts the given surrogate pair into a 32-bit UCS-4 character.
      */
     public static int toUCS4(char c, char d) {
-        assert isHigh(c) && isLow(d);
-        return (((c & 0x3ff) << 10) | (d & 0x3ff)) + 0x10000;
+        assert Character.isHighSurrogate(c) && Character.isLowSurrogate(d);
+        return Character.toCodePoint(c, d);
     }
 
     /**
@@ -178,14 +183,14 @@
          *           object
          */
         public int parse(char c, CharBuffer in) {
-            if (Surrogate.isHigh(c)) {
+            if (Character.isHighSurrogate(c)) {
                 if (!in.hasRemaining()) {
                     error = CoderResult.UNDERFLOW;
                     return -1;
                 }
                 char d = in.get();
-                if (Surrogate.isLow(d)) {
-                    character = toUCS4(c, d);
+                if (Character.isLowSurrogate(d)) {
+                    character = Character.toCodePoint(c, d);
                     isPair = true;
                     error = null;
                     return character;
@@ -193,7 +198,7 @@
                 error = CoderResult.malformedForLength(1);
                 return -1;
             }
-            if (Surrogate.isLow(c)) {
+            if (Character.isLowSurrogate(c)) {
                 error = CoderResult.malformedForLength(1);
                 return -1;
             }
@@ -220,14 +225,14 @@
          */
         public int parse(char c, char[] ia, int ip, int il) {
             assert (ia[ip] == c);
-            if (Surrogate.isHigh(c)) {
+            if (Character.isHighSurrogate(c)) {
                 if (il - ip < 2) {
                     error = CoderResult.UNDERFLOW;
                     return -1;
                 }
                 char d = ia[ip + 1];
-                if (Surrogate.isLow(d)) {
-                    character = toUCS4(c, d);
+                if (Character.isLowSurrogate(d)) {
+                    character = Character.toCodePoint(c, d);
                     isPair = true;
                     error = null;
                     return character;
@@ -235,7 +240,7 @@
                 error = CoderResult.malformedForLength(1);
                 return -1;
             }
-            if (Surrogate.isLow(c)) {
+            if (Character.isLowSurrogate(c)) {
                 error = CoderResult.malformedForLength(1);
                 return -1;
             }
@@ -282,7 +287,7 @@
          *           error() will return a descriptive result object
          */
         public int generate(int uc, int len, CharBuffer dst) {
-            if (uc <= 0xffff) {
+            if (Surrogate.isBMP(uc)) {
                 if (Surrogate.is(uc)) {
                     error = CoderResult.malformedForLength(len);
                     return -1;
@@ -294,12 +299,7 @@
                 dst.put((char)uc);
                 error = null;
                 return 1;
-            }
-            if (uc < Surrogate.UCS4_MIN) {
-                error = CoderResult.malformedForLength(len);
-                return -1;
-            }
-            if (uc <= Surrogate.UCS4_MAX) {
+            } else if (Character.isSupplementaryCodePoint(uc)) {
                 if (dst.remaining() < 2) {
                     error = CoderResult.OVERFLOW;
                     return -1;
@@ -308,9 +308,10 @@
                 dst.put(Surrogate.low(uc));
                 error = null;
                 return 2;
+            } else {
+                error = CoderResult.unmappableForLength(len);
+                return -1;
             }
-            error = CoderResult.unmappableForLength(len);
-            return -1;
         }
 
         /**
@@ -330,7 +331,7 @@
          *           error() will return a descriptive result object
          */
         public int generate(int uc, int len, char[] da, int dp, int dl) {
-            if (uc <= 0xffff) {
+            if (Surrogate.isBMP(uc)) {
                 if (Surrogate.is(uc)) {
                     error = CoderResult.malformedForLength(len);
                     return -1;
@@ -342,12 +343,7 @@
                 da[dp] = (char)uc;
                 error = null;
                 return 1;
-            }
-            if (uc < Surrogate.UCS4_MIN) {
-                error = CoderResult.malformedForLength(len);
-                return -1;
-            }
-            if (uc <= Surrogate.UCS4_MAX) {
+            } else if (Character.isSupplementaryCodePoint(uc)) {
                 if (dl - dp < 2) {
                     error = CoderResult.OVERFLOW;
                     return -1;
@@ -356,11 +352,11 @@
                 da[dp + 1] = Surrogate.low(uc);
                 error = null;
                 return 2;
+            } else {
+                error = CoderResult.unmappableForLength(len);
+                return -1;
             }
-            error = CoderResult.unmappableForLength(len);
-            return -1;
         }
-
     }
 
 }
--- a/src/share/classes/sun/security/krb5/Config.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/krb5/Config.java	Mon Jul 27 22:28:29 2009 -0700
@@ -70,7 +70,12 @@
     private static final int BASE16_1 = 16;
     private static final int BASE16_2 = 16 * 16;
     private static final int BASE16_3 = 16 * 16 * 16;
-    private String defaultRealm;   // default kdc realm.
+
+    /**
+     * Specified by system properties. Must be both null or non-null.
+     */
+    private final String defaultRealm;
+    private final String defaultKDC;
 
     // used for native interface
     private static native String getWindowsDirectory(boolean isSystem);
@@ -81,9 +86,8 @@
      * singleton) is returned.
      *
      * @exception KrbException if error occurs when constructing a Config
-     * instance. Possible causes would be configuration file not
-     * found, either of java.security.krb5.realm or java.security.krb5.kdc
-     * not specified, error reading configuration file.
+     * instance. Possible causes would be either of java.security.krb5.realm or
+     * java.security.krb5.kdc not specified, error reading configuration file.
      */
     public static synchronized Config getInstance() throws KrbException {
         if (singleton == null) {
@@ -98,9 +102,8 @@
      * the java.security.krb5.* system properties again.
      *
      * @exception KrbException if error occurs when constructing a Config
-     * instance. Possible causes would be configuration file not
-     * found, either of java.security.krb5.realm or java.security.krb5.kdc
-     * not specified, error reading configuration file.
+     * instance. Possible causes would be either of java.security.krb5.realm or
+     * java.security.krb5.kdc not specified, error reading configuration file.
      */
 
     public static synchronized void refresh() throws KrbException {
@@ -114,56 +117,37 @@
      */
     private Config() throws KrbException {
         /*
-         * If these two system properties are being specified by the user,
-         * we ignore configuration file. If either one system property is
-         * specified, we throw exception. If neither of them are specified,
-         * we load the information from configuration file.
+         * If either one system property is specified, we throw exception.
          */
-        String kdchost =
+        String tmp =
             java.security.AccessController.doPrivileged(
                 new sun.security.action.GetPropertyAction
                     ("java.security.krb5.kdc"));
+        if (tmp != null) {
+            // The user can specify a list of kdc hosts separated by ":"
+            defaultKDC = tmp.replace(':', ' ');
+        } else {
+            defaultKDC = null;
+        }
         defaultRealm =
             java.security.AccessController.doPrivileged(
                 new sun.security.action.GetPropertyAction
                     ("java.security.krb5.realm"));
-        if ((kdchost == null && defaultRealm != null) ||
-            (defaultRealm == null && kdchost != null)) {
+        if ((defaultKDC == null && defaultRealm != null) ||
+            (defaultRealm == null && defaultKDC != null)) {
             throw new KrbException
                 ("System property java.security.krb5.kdc and " +
                  "java.security.krb5.realm both must be set or " +
                  "neither must be set.");
         }
 
-        // Read the Kerberos configuration file
+        // Always read the Kerberos configuration file
         try {
             Vector<String> configFile;
             configFile = loadConfigFile();
             stanzaTable = parseStanzaTable(configFile);
         } catch (IOException ioe) {
-            // No krb5.conf, no problem. We'll use DNS etc.
-        }
-
-        if (kdchost != null) {
-            /*
-             * If configuration information is only specified by
-             * properties java.security.krb5.kdc and
-             * java.security.krb5.realm, we put both in the hashtable
-             * under [libdefaults].
-             */
-            if (stanzaTable == null) {
-                stanzaTable = new Hashtable<String,Object> ();
-            }
-            Hashtable<String,String> kdcs =
-                    (Hashtable<String,String>)stanzaTable.get("libdefaults");
-            if (kdcs == null) {
-                kdcs = new Hashtable<String,String> ();
-                stanzaTable.put("libdefaults", kdcs);
-            }
-            kdcs.put("default_realm", defaultRealm);
-            // The user can specify a list of kdc hosts separated by ":"
-            kdchost = kdchost.replace(':', ' ');
-            kdcs.put("kdc", kdchost);
+            // No krb5.conf, no problem. We'll use DNS or system property etc.
         }
     }
 
@@ -295,19 +279,6 @@
         String result = null;
         Hashtable subTable;
 
-        /*
-         * In the situation when kdc is specified by
-         * java.security.krb5.kdc, we get the kdc from [libdefaults] in
-         * hashtable.
-         */
-        if (name.equalsIgnoreCase("kdc") &&
-            (section.equalsIgnoreCase(getDefault("default_realm", "libdefaults"))) &&
-            (java.security.AccessController.doPrivileged(
-                new sun.security.action.
-                GetPropertyAction("java.security.krb5.kdc")) != null)) {
-            result = getDefault("kdc", "libdefaults");
-            return result;
-        }
         if (stanzaTable != null) {
             for (Enumeration e = stanzaTable.keys(); e.hasMoreElements(); ) {
                 stanzaName = (String)e.nextElement();
@@ -1035,13 +1006,13 @@
     /**
      * Resets the default kdc realm.
      * We do not need to synchronize these methods since assignments are atomic
+     *
+     * This method was useless. Kept here in case some class still calls it.
      */
     public void resetDefaultRealm(String realm) {
-        defaultRealm = realm;
         if (DEBUG) {
-            System.out.println(">>> Config reset default kdc " + defaultRealm);
+            System.out.println(">>> Config try resetting default kdc " + realm);
         }
-
     }
 
     /**
@@ -1098,6 +1069,9 @@
      * @return the default realm, always non null
      */
     public String getDefaultRealm() throws KrbException {
+        if (defaultRealm != null) {
+            return defaultRealm;
+        }
         Exception cause = null;
         String realm = getDefault("default_realm", "libdefaults");
         if ((realm == null) && useDNS_Realm()) {
@@ -1142,6 +1116,9 @@
         if (realm == null) {
             realm = getDefaultRealm();
         }
+        if (realm.equalsIgnoreCase(defaultRealm)) {
+            return defaultKDC;
+        }
         Exception cause = null;
         String kdcs = getDefault("kdc", realm);
         if ((kdcs == null) && useDNS_KDC()) {
@@ -1171,6 +1148,9 @@
             });
         }
         if (kdcs == null) {
+            if (defaultKDC != null) {
+                return defaultKDC;
+            }
             KrbException ke = new KrbException("Cannot locate KDC");
             if (cause != null) {
                 ke.initCause(cause);
--- a/src/share/classes/sun/security/krb5/KrbApReq.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/krb5/KrbApReq.java	Mon Jul 27 22:28:29 2009 -0700
@@ -294,8 +294,6 @@
         apReqMessg.ticket.sname.setRealm(apReqMessg.ticket.realm);
         enc_ticketPart.cname.setRealm(enc_ticketPart.crealm);
 
-        Config.getInstance().resetDefaultRealm(apReqMessg.ticket.realm.toString());
-
         if (!authenticator.cname.equals(enc_ticketPart.cname))
             throw new KrbApErrException(Krb5.KRB_AP_ERR_BADMATCH);
 
--- a/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java	Mon Jul 27 22:28:29 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Portions Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Portions Copyright 2000-2009 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
@@ -403,11 +403,11 @@
     /**
      * Retrieves the key table entry with the specified service name.
      * @param service the service which may have an entry in the key table.
+     * @param keyType the etype to match, returns the 1st one if -1 provided
      * @return -1 if the entry is not found, else return the entry index
      * in the list.
      */
     private int retrieveEntry(PrincipalName service, int keyType) {
-        int found = -1;
         KeyTabEntry e;
         if (entries != null) {
             for (int i = 0; i < entries.size(); i++) {
@@ -418,7 +418,7 @@
                 }
             }
         }
-        return found;
+        return -1;
     }
 
     /**
@@ -476,12 +476,29 @@
     /**
      * Removes an entry from the key table.
      * @param service the service <code>PrincipalName</code>.
+     * @param etype the etype to match, first one if -1 provided
+     * @return 1 if removed successfully, 0 otherwise
      */
-    public void deleteEntry(PrincipalName service) {
-        int result = retrieveEntry(service, -1);
+    public int deleteEntry(PrincipalName service, int etype) {
+        int result = retrieveEntry(service, etype);
         if (result != -1) {
             entries.removeElementAt(result);
+            return 1;
         }
+        return 0;
+    }
+
+    /**
+     * Removes an entry from the key table.
+     * @param service the service <code>PrincipalName</code>.
+     * @return number of entries removed
+     */
+    public int deleteEntry(PrincipalName service) {
+        int count = 0;
+        while (deleteEntry(service, -1) > 0) {
+            count++;
+        }
+        return count;
     }
 
     /**
--- a/src/share/classes/sun/security/tools/JarSigner.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/tools/JarSigner.java	Mon Jul 27 22:28:29 2009 -0700
@@ -136,7 +136,7 @@
     char[] keypass; // private key password
     String sigfile; // name of .SF file
     String sigalg; // name of signature algorithm
-    String digestalg = "SHA1"; // name of digest algorithm
+    String digestalg = "SHA-256"; // name of digest algorithm
     String signedjar; // output filename
     String tsaUrl; // location of the Timestamping Authority
     String tsaAlias; // alias for the Timestamping Authority's certificate
@@ -2205,7 +2205,7 @@
                 if (keyAlgorithm.equalsIgnoreCase("DSA"))
                     digestAlgorithm = "SHA1";
                 else if (keyAlgorithm.equalsIgnoreCase("RSA"))
-                    digestAlgorithm = "SHA1";
+                    digestAlgorithm = "SHA256";
                 else {
                     throw new RuntimeException("private key is not a DSA or "
                                                + "RSA key");
--- a/src/share/classes/sun/security/tools/KeyTool.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/tools/KeyTool.java	Mon Jul 27 22:28:29 2009 -0700
@@ -1052,7 +1052,7 @@
         X509CertImpl signerCertImpl = new X509CertImpl(encoded);
         X509CertInfo signerCertInfo = (X509CertInfo)signerCertImpl.get(
                 X509CertImpl.NAME + "." + X509CertImpl.INFO);
-        X500Name owner = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." +
+        X500Name issuer = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." +
                                            CertificateSubjectName.DN_NAME);
 
         Date firstDate = getStartDate(startDate);
@@ -1068,7 +1068,7 @@
         Signature signature = Signature.getInstance(sigAlgName);
         signature.initSign(privateKey);
 
-        X500Signer signer = new X500Signer(signature, owner);
+        X500Signer signer = new X500Signer(signature, issuer);
 
         X509CertInfo info = new X509CertInfo();
         info.set(X509CertInfo.VALIDITY, interval);
@@ -1102,7 +1102,8 @@
         PKCS10 req = new PKCS10(rawReq);
 
         info.set(X509CertInfo.KEY, new CertificateX509Key(req.getSubjectPublicKeyInfo()));
-        info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(req.getSubjectName()));
+        info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(
+                dname==null?req.getSubjectName():new X500Name(dname)));
         CertificateExtensions reqex = null;
         Iterator<PKCS10Attribute> attrs = req.getAttributes().getAttributes().iterator();
         while (attrs.hasNext()) {
@@ -1160,8 +1161,9 @@
 
         Signature signature = Signature.getInstance(sigAlgName);
         signature.initSign(privKey);
-        X500Name subject =
-            new X500Name(((X509Certificate)cert).getSubjectDN().toString());
+        X500Name subject = dname == null?
+                new X500Name(((X509Certificate)cert).getSubjectDN().toString()):
+                new X500Name(dname);
         X500Signer signer = new X500Signer(signature, subject);
 
         // Sign the request and base-64 encode it
@@ -1316,7 +1318,7 @@
         if ("DSA".equalsIgnoreCase(keyAlgName)) {
             return "SHA1WithDSA";
         } else if ("RSA".equalsIgnoreCase(keyAlgName)) {
-            return "SHA1WithRSA";
+            return "SHA256WithRSA";
         } else if ("EC".equalsIgnoreCase(keyAlgName)) {
             return "SHA1withECDSA";
         } else {
@@ -1334,6 +1336,8 @@
         if (keysize == -1) {
             if ("EC".equalsIgnoreCase(keyAlgName)) {
                 keysize = 256;
+            } else if ("RSA".equalsIgnoreCase(keyAlgName)) {
+                keysize = 2048;
             } else {
                 keysize = 1024;
             }
@@ -2497,6 +2501,7 @@
                         cert.getNotAfter().toString(),
                         getCertFingerPrint("MD5", cert),
                         getCertFingerPrint("SHA1", cert),
+                        getCertFingerPrint("SHA-256", cert),
                         cert.getSigAlgName(),
                         cert.getVersion()
                         };
@@ -3428,7 +3433,7 @@
 
                 int colonpos = name.indexOf(':');
                 if (colonpos >= 0) {
-                    if (name.substring(colonpos+1).equalsIgnoreCase("critical")) {
+                    if (oneOf(name.substring(colonpos+1), "critical") == 0) {
                         isCritical = true;
                     }
                     name = name.substring(0, colonpos);
@@ -3689,6 +3694,8 @@
         System.err.println(rb.getString
                 ("\t     [-alias <alias>] [-sigalg <sigalg>]"));
         System.err.println(rb.getString
+                ("\t     [-dname <dname>]"));
+        System.err.println(rb.getString
                 ("\t     [-file <csr_file>] [-keypass <keypass>]"));
         System.err.println(rb.getString
                 ("\t     [-keystore <keystore>] [-storepass <storepass>]"));
@@ -3771,6 +3778,8 @@
         System.err.println(rb.getString
                 ("\t     [-alias <alias>]"));
         System.err.println(rb.getString
+                ("\t     [-dname <dname>]"));
+        System.err.println(rb.getString
                 ("\t     [-sigalg <sigalg>]"));
         System.err.println(rb.getString
                 ("\t     [-startdate <startdate>]"));
--- a/src/share/classes/sun/security/util/Resources.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/classes/sun/security/util/Resources.java	Mon Jul 27 22:28:29 2009 -0700
@@ -215,7 +215,7 @@
         {"\t(RETURN if same as for <otherAlias>)",
                 "\t(RETURN if same as for <{0}>)"},
         {"*PATTERN* printX509Cert",
-                "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5:  {5}\n\t SHA1: {6}\n\t Signature algorithm name: {7}\n\t Version: {8}"},
+                "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5:  {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"},
         {"What is your first and last name?",
                 "What is your first and last name?"},
         {"What is the name of your organizational unit?",
@@ -301,6 +301,7 @@
                 "-certreq     [-v] [-protected]"},
         {"\t     [-alias <alias>] [-sigalg <sigalg>]",
                 "\t     [-alias <alias>] [-sigalg <sigalg>]"},
+        {"\t     [-dname <dname>]", "\t     [-dname <dname>]"},
         {"\t     [-file <csr_file>] [-keypass <keypass>]",
                 "\t     [-file <csr_file>] [-keypass <keypass>]"},
         {"\t     [-keystore <keystore>] [-storepass <storepass>]",
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Mon Jul 27 22:28:29 2009 -0700
@@ -337,7 +337,7 @@
     CK_ULONG ckTokenNumber;
     CK_SLOT_ID_PTR ckpSlotList;
     CK_BBOOL ckTokenPresent;
-    jlongArray jSlotList;
+    jlongArray jSlotList = NULL;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -637,7 +637,7 @@
     CK_SLOT_ID ckSlotID;
     CK_ULONG ckMechanismNumber;
     CK_MECHANISM_TYPE_PTR ckpMechanismList;
-    jlongArray jMechanismList;
+    jlongArray jMechanismList = NULL;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Mon Jul 27 22:28:29 2009 -0700
@@ -73,9 +73,8 @@
     CK_MECHANISM ckMechanism;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    CK_OBJECT_HANDLE ckKeyHandle;
+    CK_OBJECT_HANDLE ckKeyHandle = 0;
     jlong jKeyHandle = 0L;
-    CK_ULONG i;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -151,8 +150,7 @@
     CK_OBJECT_HANDLE_PTR ckpPublicKeyHandle;  /* pointer to Public Key */
     CK_OBJECT_HANDLE_PTR ckpPrivateKeyHandle; /* pointer to Private Key */
     CK_OBJECT_HANDLE_PTR ckpKeyHandles;     /* pointer to array with Public and Private Key */
-    jlongArray jKeyHandles;
-    CK_ULONG i;
+    jlongArray jKeyHandles = NULL;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -299,9 +297,8 @@
     CK_ULONG ckWrappedKeyLength;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    CK_OBJECT_HANDLE ckKeyHandle;
+    CK_OBJECT_HANDLE ckKeyHandle = 0;
     jlong jKeyHandle = 0L;
-    CK_ULONG i;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -478,8 +475,7 @@
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
     CK_OBJECT_HANDLE ckKeyHandle = 0;
-    jlong jKeyHandle;
-    CK_ULONG i;
+    jlong jKeyHandle = 0L;
     CK_RV rv;
     CK_OBJECT_HANDLE_PTR phKey = &ckKeyHandle;
 
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Mon Jul 27 22:28:29 2009 -0700
@@ -72,8 +72,7 @@
     CK_OBJECT_HANDLE ckObjectHandle;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    jlong jObjectHandle;
-    CK_ULONG i;
+    jlong jObjectHandle = 0L;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -114,8 +113,7 @@
     CK_OBJECT_HANDLE ckNewObjectHandle;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    jlong jNewObjectHandle;
-    CK_ULONG i;
+    jlong jNewObjectHandle = 0L;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -180,7 +178,7 @@
     CK_SESSION_HANDLE ckSessionHandle;
     CK_OBJECT_HANDLE ckObjectHandle;
     CK_ULONG ckObjectSize;
-    jlong jObjectSize;
+    jlong jObjectSize = 0L;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -217,7 +215,7 @@
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
     CK_ULONG ckBufferLength;
-    CK_ULONG i, j;
+    CK_ULONG i;
     jobject jAttribute;
     CK_RV rv;
 
@@ -307,7 +305,6 @@
     CK_OBJECT_HANDLE ckObjectHandle;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    CK_ULONG i;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -342,7 +339,6 @@
     CK_SESSION_HANDLE ckSessionHandle;
     CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
     CK_ULONG ckAttributesLength;
-    CK_ULONG i;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
@@ -385,7 +381,7 @@
     CK_ULONG ckMaxObjectLength;
     CK_OBJECT_HANDLE_PTR ckpObjectHandleArray;
     CK_ULONG ckActualObjectCount;
-    jlongArray jObjectHandleArray;
+    jlongArray jObjectHandleArray = NULL;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
     if (ckpFunctions == NULL) { return NULL; }
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Mon Jul 27 22:28:29 2009 -0700
@@ -110,7 +110,7 @@
     CK_BYTE_PTR ckpSignature;
     CK_ULONG ckDataLength;
     CK_ULONG ckSignatureLength = 0;
-    jbyteArray jSignature;
+    jbyteArray jSignature = NULL;
     CK_RV rv;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Mon Jul 27 22:28:29 2009 -0700
@@ -194,16 +194,14 @@
     jclass jPKCS11ExceptionClass;
     jmethodID jConstructor;
     jthrowable jPKCS11Exception;
-    jlong jErrorCode;
+    jlong jErrorCode = 0L;
 
-    if (returnValue == CKR_OK) {
-        return 0L ;
-    } else {
+    if (returnValue != CKR_OK) {
+        jErrorCode = ckULongToJLong(returnValue);
         jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
         if (jPKCS11ExceptionClass != NULL) {
             jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
             if (jConstructor != NULL) {
-                jErrorCode = ckULongToJLong(returnValue);
                 jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
                 if (jPKCS11Exception != NULL) {
                     (*env)->Throw(env, jPKCS11Exception);
@@ -211,8 +209,8 @@
             }
         }
         (*env)->DeleteLocalRef(env, jPKCS11ExceptionClass);
-        return jErrorCode ;
     }
+    return jErrorCode ;
 }
 
 /*
--- a/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Mon Jul 27 22:28:29 2009 -0700
@@ -300,7 +300,7 @@
 
 /* funktions to convert a CK-type array and the array length to a Java array */
 
-jcharArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
+jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
 jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength);
 jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length);
 jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength);
--- a/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java	Mon Jul 27 22:28:29 2009 -0700
@@ -127,8 +127,6 @@
 
     /* -- End of fields protected by stateLock -- */
 
-    private SctpResultContainer commUpResultContainer;  /* null */
-
     /**
      * Constructor for normal connecting sockets
      */
@@ -761,12 +759,6 @@
                     if (!ensureReceiveOpen())
                         return null;
 
-                    if (commUpResultContainer != null) {
-                        resultContainer = commUpResultContainer;
-                        commUpResultContainer = null;
-                        continue;
-                    }
-
                     int n = 0;
                     try {
                         begin();
@@ -778,7 +770,7 @@
                         }
 
                         do {
-                            n = receive(fdVal, buffer, resultContainer);
+                            n = receive(fdVal, buffer, resultContainer, fromConnect);
                         } while ((n == IOStatus.INTERRUPTED) && isOpen());
                     } finally {
                         receiverCleanup();
@@ -809,9 +801,9 @@
 
                     if (fromConnect)  {
                         /* If we reach here, then it was connect that invoked
-                         * receive an received the COMM_UP. Save it and allow
-                         * the user handler to process it upon next receive. */
-                        commUpResultContainer = resultContainer;
+                         * receive and received the COMM_UP. We have already
+                         * handled the COMM_UP with the internal notification
+                         * handler. Simply return. */
                         return null;
                     }
                 }  /* receiveLock */
@@ -827,20 +819,21 @@
 
     private int receive(int fd,
                         ByteBuffer dst,
-                        SctpResultContainer resultContainer)
+                        SctpResultContainer resultContainer,
+                        boolean peek)
             throws IOException {
         int pos = dst.position();
         int lim = dst.limit();
         assert (pos <= lim);
         int rem = (pos <= lim ? lim - pos : 0);
         if (dst instanceof DirectBuffer && rem > 0)
-            return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos);
+            return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos, peek);
 
         /* Substitute a native buffer */
         int newSize = Math.max(rem, 1);
         ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize);
         try {
-            int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0);
+            int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0, peek);
             bb.flip();
             if (n > 0 && rem > 0)
                 dst.put(bb);
@@ -854,10 +847,11 @@
                                         SctpResultContainer resultContainer,
                                         ByteBuffer bb,
                                         int rem,
-                                        int pos)
+                                        int pos,
+                                        boolean peek)
         throws IOException
     {
-        int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem);
+        int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem, peek);
 
         if (n > 0)
             bb.position(pos + n);
@@ -1089,7 +1083,7 @@
     private static native void initIDs();
 
     static native int receive0(int fd, SctpResultContainer resultContainer,
-            long address, int length) throws IOException;
+            long address, int length, boolean peek) throws IOException;
 
     static native int send0(int fd, long address, int length,
             SocketAddress target, int assocId, int streamNumber,
--- a/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java	Mon Jul 27 22:28:29 2009 -0700
@@ -31,6 +31,8 @@
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.util.Collections;
+import java.util.Map.Entry;
+import java.util.Iterator;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.HashMap;
@@ -702,7 +704,7 @@
             int assocId = association.associationID();
             Set<SocketAddress> addresses = null;
 
-            try {
+             try {
                 addresses = SctpNet.getRemoteAddresses(fdVal, assocId);
             } catch (IOException unused) {
                 /* OK, determining connected addresses may not be possible
@@ -723,9 +725,11 @@
                 /* We cannot determine the connected addresses */
                 Set<java.util.Map.Entry<SocketAddress, Association>> addrAssocs =
                         addressMap.entrySet();
-                for (java.util.Map.Entry<SocketAddress, Association> entry : addrAssocs) {
+                Iterator<Entry<SocketAddress, Association>> iterator = addrAssocs.iterator();
+                while (iterator.hasNext()) {
+                    Entry<SocketAddress, Association> entry = iterator.next();
                     if (entry.getValue().equals(association)) {
-                        addressMap.remove(entry.getKey());
+                        iterator.remove();
                     }
                 }
             }
@@ -957,7 +961,7 @@
                                 int length)
             throws IOException{
         return SctpChannelImpl.receive0(fd, resultContainer, address,
-                length);
+                length, false /*peek */);
     }
 
     private static int send0(int fd,
--- a/src/solaris/native/sun/nio/ch/SctpChannelImpl.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/solaris/native/sun/nio/ch/SctpChannelImpl.c	Mon Jul 27 22:28:29 2009 -0700
@@ -417,11 +417,11 @@
 /*
  * Class:     sun_nio_ch_SctpChannelImpl
  * Method:    receive0
- * Signature: (ILsun/nio/ch/SctpResultContainer;JI)I
+ * Signature: (ILsun/nio/ch/SctpResultContainer;JIZ)I
  */
 JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
   (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,
-   jlong address, jint length) {
+   jlong address, jint length, jboolean peek) {
     SOCKADDR sa;
     int sa_len = sizeof(sa);
     ssize_t rv = 0;
@@ -429,6 +429,7 @@
     struct iovec iov[1];
     struct msghdr msg[1];
     char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
+    int flags = peek == JNI_TRUE ? MSG_PEEK : 0;
 
     /* Set up the msghdr structure for receiving */
     memset(msg, 0, sizeof (*msg));
@@ -443,7 +444,7 @@
     msg->msg_flags = 0;
 
     do {
-        if ((rv = recvmsg(fd, msg, 0)) < 0) {
+        if ((rv = recvmsg(fd, msg, flags)) < 0) {
             if (errno == EWOULDBLOCK) {
                 return IOS_UNAVAILABLE;
             } else if (errno == EINTR) {
@@ -473,7 +474,7 @@
                 memcpy(buf, addr, rv);
                 iov->iov_base = buf + rv;
                 iov->iov_len = NOTIFICATION_BUFFER_SIZE - rv;
-                if ((rv = recvmsg(fd, msg, 0)) < 0) {
+                if ((rv = recvmsg(fd, msg, flags)) < 0) {
                     handleSocketError(env, errno);
                     return 0;
                 }
--- a/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c	Mon Jul 27 22:28:29 2009 -0700
@@ -85,19 +85,21 @@
 static jfieldID entry_dev;
 
 /**
- * System calls that may not be available at build time.
+ * System calls that may not be available at run time.
  */
 typedef int openat64_func(int, const char *, int, ...);
 typedef int fstatat64_func(int, const char *, struct stat64 *, int);
 typedef int unlinkat_func(int, const char*, int);
 typedef int renameat_func(int, const char*, int, const char*);
 typedef int futimesat_func(int, const char *, const struct timeval *);
+typedef DIR* fdopendir_func(int);
 
 static openat64_func* my_openat64_func = NULL;
 static fstatat64_func* my_fstatat64_func = NULL;
 static unlinkat_func* my_unlinkat_func = NULL;
 static renameat_func* my_renameat_func = NULL;
 static futimesat_func* my_futimesat_func = NULL;
+static fdopendir_func* my_fdopendir_func = NULL;
 
 /**
  * fstatat missing from glibc on Linux. Temporary workaround
@@ -183,7 +185,7 @@
     entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B");
     entry_dev = (*env)->GetFieldID(env, clazz, "dev", "J");
 
-    /* system calls that might not be available at build time */
+    /* system calls that might not be available at run time */
 
 #if defined(__solaris__) && defined(_LP64)
     /* Solaris 64-bit does not have openat64/fstatat64 */
@@ -196,6 +198,7 @@
     my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat");
     my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat");
     my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat");
+    my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir");
 
 #if defined(FSTATAT64_SYSCALL_AVAILABLE)
     /* fstatat64 missing from glibc */
@@ -205,7 +208,7 @@
 
     if (my_openat64_func != NULL &&  my_fstatat64_func != NULL &&
         my_unlinkat_func != NULL && my_renameat_func != NULL &&
-        my_futimesat_func != NULL)
+        my_futimesat_func != NULL && my_fdopendir_func != NULL)
     {
         flags |= sun_nio_fs_UnixNativeDispatcher_HAS_AT_SYSCALLS;
     }
@@ -565,8 +568,13 @@
 Java_sun_nio_fs_UnixNativeDispatcher_fdopendir(JNIEnv* env, jclass this, int dfd) {
     DIR* dir;
 
+    if (my_fdopendir_func == NULL) {
+        JNU_ThrowInternalError(env, "should not reach here");
+        return (jlong)-1;
+    }
+
     /* EINTR not listed as a possible error */
-    dir = fdopendir((int)dfd);
+    dir = (*my_fdopendir_func)((int)dfd);
     if (dir == NULL) {
         throwUnixException(env, errno);
     }
--- a/src/windows/classes/sun/nio/fs/WindowsPath.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/windows/classes/sun/nio/fs/WindowsPath.java	Mon Jul 27 22:28:29 2009 -0700
@@ -1177,14 +1177,20 @@
 
         /*
          * Windows treates symbolic links to directories differently than it
-         * does to other file types. For that reason we check if the exists and
-         * is a directory.
+         * does to other file types. For that reason we need to check if the
+         * target is a directory (or a directory junction).
          */
+        WindowsPath resolvedTarget;
+        if (target.type == WindowsPathType.RELATIVE) {
+            WindowsPath parent = getParent();
+            resolvedTarget = (parent == null) ? target : parent.resolve(target);
+        } else {
+            resolvedTarget = resolve(target);
+        }
         int flags = 0;
-        WindowsPath resolvedTarget =
-            WindowsPath.createFromNormalizedPath(getFileSystem(), resolve(target).path);
         try {
-            if (WindowsFileAttributes.get(resolvedTarget, true).isDirectory())
+            WindowsFileAttributes wattrs = WindowsFileAttributes.get(resolvedTarget, false);
+            if (wattrs.isDirectory() || wattrs.isDirectoryLink())
                 flags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
         } catch (WindowsException x) {
             // unable to access target so assume target is not a directory
--- a/src/windows/classes/sun/security/krb5/internal/tools/Klist.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/windows/classes/sun/security/krb5/internal/tools/Klist.java	Mon Jul 27 22:28:29 2009 -0700
@@ -1,4 +1,5 @@
 /*
+ * Portions Copyright 2003-2009 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
--- a/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java	Mon Jul 27 22:28:29 2009 -0700
@@ -1,4 +1,5 @@
 /*
+ * Portions Copyright 2003-2009 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
@@ -30,16 +31,15 @@
 package sun.security.krb5.internal.tools;
 
 import sun.security.krb5.*;
-import sun.security.krb5.internal.*;
 import sun.security.krb5.internal.ktab.*;
-import sun.security.krb5.KrbCryptoException;
-import java.lang.RuntimeException;
 import java.io.IOException;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
-import java.io.FileOutputStream;
 import java.io.File;
+import java.text.DateFormat;
 import java.util.Arrays;
+import java.util.Date;
+import sun.security.krb5.internal.crypto.EType;
 /**
  * This class can execute as a command-line tool to help the user manage
  * entires in the key table.
@@ -55,6 +55,9 @@
     char action;
     String name;   // name and directory of key table
     String principal;
+    boolean showEType;
+    boolean showTime;
+    int etype = -1;
     char[] password = null;
 
     /**
@@ -62,13 +65,14 @@
      * <br>Usage: ktab <options>
      * <br>available options to Ktab:
      * <ul>
-     * <li><b>-l</b>  list the keytab name and entries
+     * <li><b>-l [-e] [-t]</b>  list the keytab name and entries, -e show
+     * encryption etypes, -t show timestamps.
      * <li><b>-a</b>  &lt;<i>principal name</i>&gt;
      * (&lt;<i>password</i>&gt;)  add an entry to the keytab.
      * The entry is added only to the keytab. No changes are made to the
      * Kerberos database.
-     * <li><b>-d</b>  &lt;<i>principal name</i>&gt;
-     * delete an entry from the keytab
+     * <li><b>-d</b>  &lt;<i>principal name</i>&gt; [&lt;<i>etype</i>&gt;]
+     * delete an entry from the keytab.
      * The entry is deleted only from the keytab. No changes are made to the
      * Kerberos database.
      * <li><b>-k</b>  &lt;<i>keytab name</i> &gt;
@@ -182,6 +186,11 @@
                 i++;
                 if ((i < args.length) && (!args[i].startsWith("-"))) {
                     principal = args[i];
+                    int j = i + 1;
+                    if ((j < args.length) && (!args[j].startsWith("-"))) {
+                        etype = Integer.parseInt(args[j]);
+                        i = j;
+                    }
                 } else {
                     System.out.println("Please specify the principal" +
                                        "name of the entry you want to " +
@@ -207,6 +216,12 @@
                     System.exit(-1);
                 }
                 break;
+            case 'e':
+                showEType = true;
+                break;
+            case 't':
+                showTime = true;
+                break;
             default:
                 printHelp();
                 System.exit(-1);
@@ -271,25 +286,54 @@
      * Lists key table name and entries in it.
      */
     void listKt() {
-        int version;
-        String principal;
-        // System.out.println("Keytab name: " + admin.getKeyTabName());
-        System.out.println("Keytab name: " + table.tabName());
-        // KeyTabEntry[] entries = admin.getEntries();
+        System.out.println("Keytab name: " + KeyTab.tabName());
         KeyTabEntry[] entries = table.getEntries();
         if ((entries != null) && (entries.length > 0)) {
-            System.out.println("KVNO    Principal");
+            String[][] output = new String[entries.length+1][showTime?3:2];
+            int column = 0;
+            output[0][column++] = "KVNO";
+            if (showTime) output[0][column++] = "Timestamp";
+            output[0][column++] = "Principal";
             for (int i = 0; i < entries.length; i++) {
-                version = entries[i].getKey().getKeyVersionNumber().intValue();
-                principal = entries[i].getService().toString();
-                if (i == 0) {
-                    StringBuffer separator = new StringBuffer();
-                    for (int j = 0; j < 9 + principal.length(); j++) {
-                        separator.append("-");
+                column = 0;
+                output[i+1][column++] = entries[i].getKey().
+                        getKeyVersionNumber().toString();
+                if (showTime) output[i+1][column++] =
+                        DateFormat.getDateTimeInstance(
+                        DateFormat.SHORT, DateFormat.SHORT).format(
+                        new Date(entries[i].getTimeStamp().getTime()));
+                String princ = entries[i].getService().toString();
+                if (showEType) {
+                    int e = entries[i].getKey().getEType();
+                    output[i+1][column++] = princ + " (" + e + ":" +
+                            EType.toString(e) + ")";
+                } else {
+                    output[i+1][column++] = princ;
+                }
+            }
+            int[] width = new int[column];
+            for (int j=0; j<column; j++) {
+                for (int i=0; i <= entries.length; i++) {
+                    if (output[i][j].length() > width[j]) {
+                        width[j] = output[i][j].length();
                     }
-                    System.out.println(separator.toString());
                 }
-                System.out.println("  " + version + "     " + principal);
+                if (j != 0) width[j] = -width[j];
+            }
+            for (int j=0; j<column; j++) {
+                System.out.printf("%" + width[j] + "s ", output[0][j]);
+            }
+            System.out.println();
+            for (int j=0; j<column; j++) {
+                for (int k=0; k<Math.abs(width[j]); k++) System.out.print("-");
+                System.out.print(" ");
+            }
+            System.out.println();
+            for (int i=0; i<entries.length; i++) {
+                for (int j=0; j<column; j++) {
+                    System.out.printf("%" + width[j] + "s ", output[i+1][j]);
+                }
+                System.out.println();
             }
         } else {
             System.out.println("0 entry.");
@@ -309,9 +353,10 @@
             String answer;
             BufferedReader cis =
                 new BufferedReader(new InputStreamReader(System.in));
-            System.out.print("Are you sure you want to "+
+            System.out.print("Are you sure you want to"+
                              " delete service key for " + pname.toString() +
-                             " in " + table.tabName() + "?(Y/N) :");
+                             " (" + (etype==-1?"all etypes":("etype = "+etype)) +
+                             ") in " + table.tabName() + "?(Y/N): ");
 
             System.out.flush();
             answer = cis.readLine();
@@ -333,19 +378,26 @@
             e.printStackTrace();
             System.exit(-1);
         }
-        // admin.deleteEntry(pname);
-        table.deleteEntry(pname);
 
-        try {
-            table.save();
-        } catch (IOException e) {
-            System.err.println("Error occurs while saving the keytab." +
+        int count;
+        if (etype == -1) count = table.deleteEntry(pname);
+        else count = table.deleteEntry(pname, etype);
+
+        if (count == 0) {
+            System.err.println("No matched entry in the keytab. " +
                                "Deletion fails.");
-            e.printStackTrace();
             System.exit(-1);
+        } else {
+            try {
+                table.save();
+            } catch (IOException e) {
+                System.err.println("Error occurs while saving the keytab. " +
+                                   "Deletion fails.");
+                e.printStackTrace();
+                System.exit(-1);
+            }
+            System.out.println("Done!");
         }
-        System.out.println("Done!");
-
     }
 
     /**
@@ -355,12 +407,12 @@
         System.out.println("\nUsage: ktab " +
                            "<options>");
         System.out.println("available options to Ktab:");
-        System.out.println("-l\t\t\t\tlist the keytab name and entries");
+        System.out.println("-l [-e] [-t]\t\t\tlist the keytab name and entries,\n\t\t\t\t-e with etype, -t with timestamp");
         System.out.println("-a <principal name> (<password>)add an entry " +
                            "to the keytab");
-        System.out.println("-d <principal name>\t\tdelete an entry from "+
-                           "the keytab");
+        System.out.println("-d <principal name> [<etype>]\tdelete an "+
+                           "entry from the keytab");
         System.out.println("-k <keytab name>\t\tspecify keytab name and "+
-                           " path with prefix FILE:");
+                           "path with prefix FILE:");
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jndi/ldap/BalancedParentheses.java	Mon Jul 27 22:28:29 2009 -0700
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2009 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 6449574
+ * @summary Invalid ldap filter is accepted and processed
+ */
+
+import java.io.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+import java.util.Properties;
+import java.util.Hashtable;
+
+import java.net.Socket;
+import java.net.ServerSocket;
+
+public class BalancedParentheses {
+    // Should we run the client or server in a separate thread?
+    //
+    // Both sides can throw exceptions, but do you have a preference
+    // as to which side should be the main thread.
+    static boolean separateServerThread = true;
+
+    // use any free port by default
+    volatile int serverPort = 0;
+
+    // Is the server ready to serve?
+    volatile static boolean serverReady = false;
+
+    // Define the server side of the test.
+    //
+    // If the server prematurely exits, serverReady will be set to true
+    // to avoid infinite hangs.
+    void doServerSide() throws Exception {
+        ServerSocket serverSock = new ServerSocket(serverPort);
+
+        // signal client, it's ready to accecpt connection
+        serverPort = serverSock.getLocalPort();
+        serverReady = true;
+
+        // accept a connection
+        Socket socket = serverSock.accept();
+        System.out.println("Server: Connection accepted");
+
+        InputStream is = socket.getInputStream();
+        OutputStream os = socket.getOutputStream();
+
+        // read the bindRequest
+        while (is.read() != -1) {
+            // ignore
+            is.skip(is.available());
+            break;
+        }
+
+        byte[] bindResponse = {0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A,
+                               0x01, 0x00, 0x04, 0x00, 0x04, 0x00};
+        // write bindResponse
+        os.write(bindResponse);
+        os.flush();
+
+        // ignore any more request.
+        while (is.read() != -1) {
+            // ignore
+            is.skip(is.available());
+        }
+
+        is.close();
+        os.close();
+        socket.close();
+        serverSock.close();
+    }
+
+    //  Define the client side of the test.
+    //
+    // If the server prematurely exits, serverReady will be set to true
+    // to avoid infinite hangs.
+    void doClientSide() throws Exception {
+        // Wait for server to get started.
+        while (!serverReady) {
+            Thread.sleep(50);
+        }
+
+        // set up the environment for creating the initial context
+        Hashtable<Object, Object> env = new Hashtable<Object, Object>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, "ldap://localhost:" + serverPort);
+        env.put("com.sun.jndi.ldap.read.timeout", "1000");
+
+        // env.put(Context.SECURITY_AUTHENTICATION, "simple");
+        // env.put(Context.SECURITY_PRINCIPAL,"cn=root");
+        // env.put(Context.SECURITY_CREDENTIALS,"root");
+
+        // create initial context
+        DirContext context = new InitialDirContext(env);
+
+        // searching
+        SearchControls scs = new SearchControls();
+        scs.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+        try {
+            NamingEnumeration answer = context.search(
+                                        "o=sun,c=us", "(&(cn=Bob)))", scs);
+        } catch (InvalidSearchFilterException isfe) {
+            // ignore, it is the expected filter exception.
+            System.out.println("Expected exception: " + isfe.getMessage());
+        } catch (NamingException ne) {
+            // maybe a read timeout exception, as the server does not response.
+            throw new Exception("Expect a InvalidSearchFilterException", ne);
+        }
+
+        try {
+            NamingEnumeration answer = context.search(
+                                        "o=sun,c=us", ")(&(cn=Bob)", scs);
+        } catch (InvalidSearchFilterException isfe) {
+            // ignore, it is the expected filter exception.
+            System.out.println("Expected exception: " + isfe.getMessage());
+        } catch (NamingException ne) {
+            // maybe a read timeout exception, as the server does not response.
+            throw new Exception("Expect a InvalidSearchFilterException", ne);
+        }
+
+        try {
+            NamingEnumeration answer = context.search(
+                                        "o=sun,c=us", "(&(cn=Bob))", scs);
+        } catch (InvalidSearchFilterException isfe) {
+            // ignore, it is the expected filter exception.
+            throw new Exception("Unexpected ISFE", isfe);
+        } catch (NamingException ne) {
+            // maybe a read timeout exception, as the server does not response.
+            System.out.println("Expected exception: " + ne.getMessage());
+        }
+
+        context.close();
+    }
+
+    /*
+     * ============================================================
+     * The remainder is just support stuff
+     */
+
+    // client and server thread
+    Thread clientThread = null;
+    Thread serverThread = null;
+
+    // client and server exceptions
+    volatile Exception serverException = null;
+    volatile Exception clientException = null;
+
+    void startServer(boolean newThread) throws Exception {
+        if (newThread) {
+            serverThread = new Thread() {
+                public void run() {
+                    try {
+                        doServerSide();
+                    } catch (Exception e) {
+                        /*
+                         * Our server thread just died.
+                         *
+                         * Release the client, if not active already...
+                         */
+                        System.err.println("Server died...");
+                        System.err.println(e);
+                        serverReady = true;
+                        serverException = e;
+                    }
+                }
+            };
+            serverThread.start();
+        } else {
+            doServerSide();
+        }
+    }
+
+    void startClient(boolean newThread) throws Exception {
+        if (newThread) {
+            clientThread = new Thread() {
+                public void run() {
+                    try {
+                        doClientSide();
+                    } catch (Exception e) {
+                        /*
+                         * Our client thread just died.
+                         */
+                        System.err.println("Client died...");
+                        clientException = e;
+                    }
+                }
+            };
+            clientThread.start();
+        } else {
+            doClientSide();
+        }
+    }
+
+    // Primary constructor, used to drive remainder of the test.
+    BalancedParentheses() throws Exception {
+        if (separateServerThread) {
+            startServer(true);
+            startClient(false);
+        } else {
+            startClient(true);
+            startServer(false);
+        }
+
+        /*
+         * Wait for other side to close down.
+         */
+        if (separateServerThread) {
+            serverThread.join();
+        } else {
+            clientThread.join();
+        }
+
+        /*
+         * When we get here, the test is pretty much over.
+         *
+         * If the main thread excepted, that propagates back
+         * immediately.  If the other thread threw an exception, we
+         * should report back.
+         */
+        if (serverException != null) {
+            System.out.print("Server Exception:");
+            throw serverException;
+        }
+        if (clientException != null) {
+            System.out.print("Client Exception:");
+            throw clientException;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        // start the test
+        new BalancedParentheses();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/nio/sctp/SctpChannel/CommUp.java	Mon Jul 27 22:28:29 2009 -0700
@@ -0,0 +1,364 @@
+/*
+ * Copyright 2009 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 6863110
+ * @summary Newly connected/accepted SctpChannel should fire OP_READ if registered with a Selector
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.nio.ByteBuffer;
+import java.nio.channels.Selector;
+import java.nio.channels.SelectionKey;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.Notification;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.ShutdownNotification;
+import static java.lang.System.out;
+import static java.lang.System.err;
+import static java.nio.channels.SelectionKey.OP_CONNECT;
+import static java.nio.channels.SelectionKey.OP_READ;
+
+public class CommUp {
+    static CountDownLatch acceptLatch = new CountDownLatch(1);
+    static final int TIMEOUT = 10000;
+
+    CommUpNotificationHandler clientHandler = new CommUpNotificationHandler();
+    CommUpNotificationHandler serverHandler = new CommUpNotificationHandler();
+    CommUpServer server;
+    Thread clientThread;
+
+    void test(String[] args) {
+        SocketAddress address = null;
+
+        if (!Util.isSCTPSupported()) {
+            out.println("SCTP protocol is not supported");
+            out.println("Test cannot be run");
+            return;
+        }
+
+        if (args.length == 2) {
+            /* requested to connecct to a specific address */
+            try {
+                int port = Integer.valueOf(args[1]);
+                address = new InetSocketAddress(args[0], port);
+            } catch (NumberFormatException nfe) {
+                err.println(nfe);
+            }
+        } else {
+            /* start server on local machine, default */
+            try {
+                server = new CommUpServer();
+                server.start();
+                address = server.address();
+                debug("Server started and listening on " + address);
+            } catch (IOException ioe) {
+                ioe.printStackTrace();
+                return;
+            }
+        }
+
+        /* store the main thread so that the server can interrupt it, if necessary */
+        clientThread = Thread.currentThread();
+
+        doClient(address);
+    }
+
+    void doClient(SocketAddress peerAddress) {
+        SctpChannel sc = null;
+        try {
+            debug("connecting to " + peerAddress);
+            sc = SctpChannel.open();
+            sc.configureBlocking(false);
+            check(sc.isBlocking() == false, "Should be in non-blocking mode");
+            sc.connect(peerAddress);
+
+            Selector selector = Selector.open();
+            SelectionKey selectiontKey = sc.register(selector, OP_CONNECT);
+
+            /* Expect two interest Ops */
+            boolean opConnectReceived = false;
+            boolean opReadReceived = false;
+            for (int z=0; z<2; z++) {
+                debug("select " + z);
+                int keysAdded = selector.select(TIMEOUT);
+                debug("returned " + keysAdded + " keys");
+                if (keysAdded > 0) {
+                    Set<SelectionKey> keys = selector.selectedKeys();
+                    Iterator<SelectionKey> i = keys.iterator();
+                    while(i.hasNext()) {
+                        SelectionKey sk = i.next();
+                        i.remove();
+                        SctpChannel readyChannel =
+                            (SctpChannel)sk.channel();
+
+                        /* OP_CONNECT */
+                        if (sk.isConnectable()) {
+                            /* some trivial checks */
+                            check(opConnectReceived == false,
+                                  "should only received one OP_CONNECT");
+                            check(opReadReceived == false,
+                                  "should not receive OP_READ before OP_CONNECT");
+                            check(readyChannel.equals(sc),
+                                  "channels should be equal");
+                            check(!sk.isAcceptable(),
+                                  "key should not be acceptable");
+                            check(!sk.isReadable(),
+                                  "key should not be readable");
+                            check(!sk.isWritable(),
+                                  "key should not be writable");
+
+                            /* now process the OP_CONNECT */
+                            opConnectReceived = true;
+                            check((sk.interestOps() & OP_CONNECT) == OP_CONNECT,
+                                  "selection key interest ops should contain OP_CONNECT");
+                            sk.interestOps(OP_READ);
+                            check((sk.interestOps() & OP_CONNECT) != OP_CONNECT,
+                                  "selection key interest ops should not contain OP_CONNECT");
+                            check(sc.finishConnect(),
+                                  "finishConnect should return true");
+                        } /* OP_READ */
+                          else if (sk.isReadable()) {
+                            /* some trivial checks */
+                            check(opConnectReceived == true,
+                                  "should receive one OP_CONNECT before OP_READ");
+                            check(opReadReceived == false,
+                                  "should not receive OP_READ before OP_CONNECT");
+                            check(readyChannel.equals(sc),
+                                  "channels should be equal");
+                            check(!sk.isAcceptable(),
+                                  "key should not be acceptable");
+                            check(sk.isReadable(),
+                                  "key should be readable");
+                            check(!sk.isWritable(),
+                                  "key should not be writable");
+                            check(!sk.isConnectable(),
+                                  "key should not be connectable");
+
+                            /* now process the OP_READ */
+                            opReadReceived = true;
+                            selectiontKey.cancel();
+
+                            /* try with small buffer to see if native
+                             * implementation can handle this */
+                            ByteBuffer buffer = ByteBuffer.allocateDirect(1);
+                            readyChannel.receive(buffer, null, clientHandler);
+                            check(clientHandler.receivedCommUp(),
+                                    "Client should have received COMM_UP");
+
+                            /* dont close (or put anything on) the channel until
+                             * we check that the server's accepted channel also
+                             * received COMM_UP */
+                            serverHandler.waitForCommUp();
+                        } else {
+                            fail("Unexpected selection key");
+                        }
+                    }
+                } else {
+                    fail("Client selector returned 0 ready keys");
+                    /* stop the server */
+                    server.thread().interrupt();
+                }
+            } //for
+
+        } catch (IOException ioe) {
+            unexpected(ioe);
+        } catch (InterruptedException ie) {
+            unexpected(ie);
+        }
+    }
+
+    class CommUpServer implements Runnable
+    {
+        final InetSocketAddress serverAddr;
+        private SctpServerChannel ssc;
+        private Thread serverThread;
+
+        public CommUpServer() throws IOException {
+            ssc = SctpServerChannel.open().bind(null);
+            java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+            if (addrs.isEmpty())
+                debug("addrs should not be empty");
+
+            serverAddr = (InetSocketAddress) addrs.iterator().next();
+        }
+
+        void start() {
+            serverThread = new Thread(this, "CommUpServer-"  +
+                                              serverAddr.getPort());
+            serverThread.start();
+        }
+
+        InetSocketAddress address () {
+            return serverAddr;
+        }
+
+        Thread thread() {
+            return serverThread;
+        }
+
+        @Override
+        public void run() {
+            Selector selector = null;
+            SctpChannel sc = null;
+            SelectionKey readKey = null;
+            try {
+                sc = ssc.accept();
+                debug("accepted " + sc);
+
+                selector = Selector.open();
+                sc.configureBlocking(false);
+                check(sc.isBlocking() == false, "Should be in non-blocking mode");
+                readKey = sc.register(selector, SelectionKey.OP_READ);
+
+                debug("select");
+                int keysAdded = selector.select(TIMEOUT);
+                debug("returned " + keysAdded + " keys");
+                if (keysAdded > 0) {
+                    Set<SelectionKey> keys = selector.selectedKeys();
+                    Iterator<SelectionKey> i = keys.iterator();
+                    while(i.hasNext()) {
+                        SelectionKey sk = i.next();
+                        i.remove();
+                        SctpChannel readyChannel =
+                            (SctpChannel)sk.channel();
+                        check(readyChannel.equals(sc),
+                                "channels should be equal");
+                        check(!sk.isAcceptable(),
+                                "key should not be acceptable");
+                        check(sk.isReadable(),
+                                "key should be readable");
+                        check(!sk.isWritable(),
+                                "key should not be writable");
+                        check(!sk.isConnectable(),
+                                "key should not be connectable");
+
+                        /* block until we check if the client has received its COMM_UP*/
+                        clientHandler.waitForCommUp();
+
+                        ByteBuffer buffer = ByteBuffer.allocateDirect(1);
+                        sc.receive(buffer, null, serverHandler);
+                        check(serverHandler.receivedCommUp(),
+                                "Accepted channel should have received COMM_UP");
+                    }
+                } else {
+                   fail("Server selector returned 0 ready keys");
+                   /* stop the client */
+                   clientThread.interrupt();
+            }
+            } catch (IOException ioe) {
+                ioe.printStackTrace();
+            } catch (InterruptedException unused) {
+            } finally {
+                if (readKey != null) readKey.cancel();
+                try { if (selector != null) selector.close(); }
+                catch (IOException  ioe) { unexpected(ioe); }
+                try { if (ssc != null) ssc.close(); }
+                catch (IOException  ioe) { unexpected(ioe); }
+                try { if (sc != null) sc.close(); }
+                catch (IOException  ioe) { unexpected(ioe); }
+            }
+        }
+    }
+
+    class CommUpNotificationHandler extends AbstractNotificationHandler<Object>
+    {
+        private boolean receivedCommUp;  // false
+
+        public synchronized boolean receivedCommUp() {
+            return receivedCommUp;
+        }
+
+        public synchronized boolean waitForCommUp() throws InterruptedException {
+            while (receivedCommUp == false) {
+                wait();
+            }
+
+            return false;
+        }
+
+        @Override
+        public HandlerResult handleNotification(
+                Notification notification, Object attachment) {
+            fail("Unknown notification type");
+            return HandlerResult.CONTINUE;
+        }
+
+        @Override
+        public synchronized HandlerResult handleNotification(
+                AssociationChangeNotification notification, Object attachment) {
+            AssocChangeEvent event = notification.event();
+            debug("AssociationChangeNotification");
+            debug("  Association: " + notification.association());
+            debug("  Event: " + event);
+
+            if (event.equals(AssocChangeEvent.COMM_UP)) {
+                receivedCommUp = true;
+                notifyAll();
+            }
+
+            return HandlerResult.RETURN;
+        }
+
+        @Override
+        public HandlerResult handleNotification(
+                ShutdownNotification notification, Object attachment) {
+            debug("ShutdownNotification");
+            debug("  Association: " + notification.association());
+            return HandlerResult.RETURN;
+        }
+    }
+
+        //--------------------- Infrastructure ---------------------------
+    boolean debug = true;
+    volatile int passed = 0, failed = 0;
+    void pass() {passed++;}
+    void fail() {failed++; Thread.dumpStack();}
+    void fail(String msg) {err.println(msg); fail();}
+    void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    void check(boolean cond) {if (cond) pass(); else fail();}
+    void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+    void debug(String message) {if(debug) { out.println(Thread.currentThread().getName() + ": " + message); }  }
+    void sleep(long millis) { try { Thread.currentThread().sleep(millis); }
+                          catch(InterruptedException ie) { unexpected(ie); }}
+    public static void main(String[] args) throws Throwable {
+        Class<?> k = new Object(){}.getClass().getEnclosingClass();
+        try {k.getMethod("instanceMain",String[].class)
+                .invoke( k.newInstance(), (Object) args);}
+        catch (Throwable e) {throw e.getCause();}}
+    public void instanceMain(String[] args) throws Throwable {
+        try {test(args);} catch (Throwable t) {unexpected(t);}
+        out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- a/test/com/sun/nio/sctp/SctpMultiChannel/Branch.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/com/sun/nio/sctp/SctpMultiChannel/Branch.java	Mon Jul 27 22:28:29 2009 -0700
@@ -115,7 +115,6 @@
             /* Receive the COMM_UP */
             buffer.clear();
             BranchNotificationHandler handler = new BranchNotificationHandler();
-            channel.configureBlocking(false);
             info = channel.receive(buffer, null, handler);
             check(handler.receivedCommUp(), "COMM_UP no received");
             Set<Association> associations = channel.associations();
--- a/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java	Mon Jul 27 22:28:29 2009 -0700
@@ -181,7 +181,6 @@
         /* Receive the COMM_UP */
         buffer.clear();
         SOTNotificationHandler handler = new SOTNotificationHandler();
-        smc.configureBlocking(false);
         info = smc.receive(buffer, null, handler);
         check(handler.receivedCommUp(), "COMM_UP no received");
         Set<Association> associations = smc.associations();
@@ -220,6 +219,7 @@
             }
             check(found, "SCTP_PRIMARY_ADDR returned bogus address!");
 
+            System.out.println("Try SCTP_PRIMARY_ADDR set to: " + addrToSet);
             smc.setOption(SCTP_PRIMARY_ADDR, addrToSet, assoc);
             System.out.println("SCTP_PRIMARY_ADDR set to: " + addrToSet);
             primaryAddr = smc.getOption(SCTP_PRIMARY_ADDR, assoc);
--- a/test/java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java	Mon Jul 27 22:28:29 2009 -0700
@@ -44,9 +44,9 @@
         final AsynchronousServerSocketChannel listener =
             AsynchronousServerSocketChannel.open()
                 .bind(new InetSocketAddress(0));
-        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+        listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
             public void completed(AsynchronousSocketChannel ch, Void att) {
-                listener.accept(null, this);
+                listener.accept((Void)null, this);
             }
             public void failed(Throwable exc, Void att) {
             }
@@ -81,13 +81,13 @@
         // 2. the close/shutdown completes
         final CountDownLatch latch = new CountDownLatch(2);
 
-        ch.connect(sa, null, new CompletionHandler<Void,Void>() {
+        ch.connect(sa, (Void)null, new CompletionHandler<Void,Void>() {
             public void completed(Void result, Void att)  {
                 System.out.println("Connected");
 
                 // initiate I/O operation that does not complete (successfully)
                 ByteBuffer buf = ByteBuffer.allocate(100);
-                ch.read(buf, null, new CompletionHandler<Integer,Void>() {
+                ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
                     public void completed(Integer bytesRead, Void att)  {
                         throw new RuntimeException();
                     }
--- a/test/java/nio/channels/AsynchronousChannelGroup/Identity.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousChannelGroup/Identity.java	Mon Jul 27 22:28:29 2009 -0700
@@ -78,15 +78,15 @@
         final AsynchronousServerSocketChannel listener =
             AsynchronousServerSocketChannel.open()
                 .bind(new InetSocketAddress(0));
-        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+        listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
             public void completed(final AsynchronousSocketChannel ch, Void att) {
-                listener.accept(null, this);
+                listener.accept((Void)null, this);
 
                 final ByteBuffer buf = ByteBuffer.allocate(100);
-                ch.read(buf, null, new CompletionHandler<Integer,Void>() {
+                ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
                     public void completed(Integer bytesRead, Void att) {
                         buf.clear();
-                        ch.read(buf, null, this);
+                        ch.read(buf, (Void)null, this);
                     }
                     public void failed(Throwable exc, Void att) {
                     }
--- a/test/java/nio/channels/AsynchronousChannelGroup/Restart.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousChannelGroup/Restart.java	Mon Jul 27 22:28:29 2009 -0700
@@ -94,7 +94,7 @@
         for (int i=0; i<count; i++) {
             final CountDownLatch latch = new CountDownLatch(1);
 
-            listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+            listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
                 public void completed(AsynchronousSocketChannel ch, Void att) {
                     try {
                         ch.close();
--- a/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java	Mon Jul 27 22:28:29 2009 -0700
@@ -45,10 +45,10 @@
         final AsynchronousServerSocketChannel listener =
             AsynchronousServerSocketChannel.open()
                 .bind(new InetSocketAddress(0));
-        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+        listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
             public void completed(AsynchronousSocketChannel ch, Void att) {
                 queue.add(ch);
-                listener.accept(null, this);
+                listener.accept((Void)null, this);
             }
             public void failed(Throwable exc, Void att) {
             }
--- a/test/java/nio/channels/AsynchronousDatagramChannel/Basic.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousDatagramChannel/Basic.java	Mon Jul 27 22:28:29 2009 -0700
@@ -66,7 +66,7 @@
         // Test: datagram packet not received immediately
         dst.clear();
         final CountDownLatch latch = new CountDownLatch(1);
-        ch.receive(dst, null, new CompletionHandler<SocketAddress,Void>() {
+        ch.receive(dst, (Void)null, new CompletionHandler<SocketAddress,Void>() {
             public void completed(SocketAddress source, Void att) {
                 latch.countDown();
             }
@@ -82,7 +82,7 @@
         // Test: timeout
         dst.clear();
         final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
-        ch.receive(dst, 2, TimeUnit.SECONDS, null, new CompletionHandler<SocketAddress,Void>() {
+        ch.receive(dst, 2, TimeUnit.SECONDS, (Void)null, new CompletionHandler<SocketAddress,Void>() {
             public void completed(SocketAddress source, Void att) {
             }
             public void failed (Throwable exc, Void att) {
@@ -101,7 +101,7 @@
         // AsynchronousCloseException
         dst = ByteBuffer.allocateDirect(100);
         exception.set(null);
-        ch.receive(dst, null, new CompletionHandler<SocketAddress,Void>() {
+        ch.receive(dst, (Void)null, new CompletionHandler<SocketAddress,Void>() {
             public void completed(SocketAddress source, Void att) {
             }
             public void failed (Throwable exc, Void att) {
@@ -156,7 +156,7 @@
         // Test: datagram packet not received immediately
         dst.clear();
         final CountDownLatch l1 = new CountDownLatch(1);
-        ch.read(dst, null, new CompletionHandler<Integer,Void>() {
+        ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesRead, Void att) {
                 l1.countDown();
             }
@@ -172,7 +172,7 @@
         // Test: timeout
         dst.clear();
         final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
-        ch.read(dst, 2, TimeUnit.SECONDS, null, new CompletionHandler<Integer,Void>() {
+        ch.read(dst, 2, TimeUnit.SECONDS, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesRead, Void att) {
             }
             public void failed (Throwable exc, Void att) {
@@ -191,7 +191,7 @@
         // AsynchronousCloseException
         dst.clear();
         exception.set(null);
-        ch.read(dst, null, new CompletionHandler<Integer,Void>() {
+        ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesRead, Void att) {
             }
             public void failed (Throwable exc, Void att) {
@@ -238,7 +238,7 @@
         // Test: send datagram packet to reader and check completion handler
         // is invoked
         final CountDownLatch l2 = new CountDownLatch(1);
-        ch.send(ByteBuffer.wrap(msg), sa, null, new CompletionHandler<Integer,Void>() {
+        ch.send(ByteBuffer.wrap(msg), sa, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesSent, Void att) {
                 if (bytesSent != msg.length)
                     throw new RuntimeException("Unexpected number of bytes received");
@@ -261,7 +261,7 @@
         // Test: check that failed method is invoked
         ch.close();
         final CountDownLatch l3 = new CountDownLatch(1);
-        ch.send(ByteBuffer.wrap(msg), sa, null, new CompletionHandler<Integer,Void>() {
+        ch.send(ByteBuffer.wrap(msg), sa, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesSent, Void att) {
                 throw new RuntimeException("completed method invoked");
             }
@@ -315,7 +315,7 @@
 
         // Test: write datagram and check completion handler is invoked
         final CountDownLatch l2 = new CountDownLatch(1);
-        ch.write(ByteBuffer.wrap(msg), null, new CompletionHandler<Integer,Void>() {
+        ch.write(ByteBuffer.wrap(msg), (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer bytesSent, Void att) {
                 if (bytesSent != msg.length)
                     throw new RuntimeException("Unexpected number of bytes received");
@@ -372,7 +372,7 @@
             final CountDownLatch latch = new CountDownLatch(1);
             long timeout = (i == 0) ? 0L : 60L;
             Future<SocketAddress> remote = ch
-                .receive(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, null,
+                .receive(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, (Void)null,
                     new CompletionHandler<SocketAddress,Void>() {
                         public void completed(SocketAddress source, Void att) {
                         }
@@ -395,7 +395,7 @@
             final CountDownLatch latch = new CountDownLatch(1);
             long timeout = (i == 0) ? 0L : 60L;
             Future<Integer> result = ch
-                .read(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, null,
+                .read(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, (Void)null,
                     new CompletionHandler<Integer,Void>() {
                         public void completed(Integer bytesRead, Void att) {
                         }
--- a/test/java/nio/channels/AsynchronousFileChannel/Basic.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousFileChannel/Basic.java	Mon Jul 27 22:28:29 2009 -0700
@@ -190,7 +190,7 @@
             if (fl == null)
                 throw new RuntimeException("Unable to acquire lock");
             try {
-                ch.lock(null, new CompletionHandler<FileLock,Void> () {
+                ch.lock((Void)null, new CompletionHandler<FileLock,Void> () {
                     public void completed(FileLock result, Void att) {
                     }
                     public void failed(Throwable exc, Void att) {
@@ -217,7 +217,7 @@
         ByteBuffer buf = ByteBuffer.allocateDirect(100);
         final CountDownLatch latch = new CountDownLatch(1);
 
-        ch.read(buf, 0L, null, new CompletionHandler<Integer,Void>() {
+        ch.read(buf, 0L, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer result, Void att) {
                 try {
                     Thread.currentThread().interrupt();
@@ -311,7 +311,7 @@
                     final AtomicReference<Thread> invoker = new AtomicReference<Thread>();
                     final CountDownLatch latch = new CountDownLatch(1);
 
-                    ch.write(genBuffer(), 0L, null, new CompletionHandler<Integer,Void>() {
+                    ch.write(genBuffer(), 0L, (Void)null, new CompletionHandler<Integer,Void>() {
                         public void completed(Integer result, Void att) {
                             invoker.set(Thread.currentThread());
                             latch.countDown();
@@ -410,7 +410,7 @@
 
             // start write operation
             final CountDownLatch latch = new CountDownLatch(1);
-            Future<Integer> res = ch.write(genBuffer(), 0L, null,
+            Future<Integer> res = ch.write(genBuffer(), 0L, (Void)null,
                 new CompletionHandler<Integer,Void>() {
                     public void completed(Integer result, Void att) {
                     }
--- a/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java	Mon Jul 27 22:28:29 2009 -0700
@@ -95,7 +95,7 @@
        final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
 
         // start accepting
-        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
+        listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
             public void completed(AsynchronousSocketChannel ch, Void att) {
                 try {
                     ch.close();
--- a/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Mon Jul 27 22:28:29 2009 -0700
@@ -181,7 +181,7 @@
         }
         final AtomicReference<Throwable> connectException =
             new AtomicReference<Throwable>();
-        ch.connect(server.address(), null, new CompletionHandler<Void,Void>() {
+        ch.connect(server.address(), (Void)null, new CompletionHandler<Void,Void>() {
             public void completed(Void result, Void att) {
             }
             public void failed(Throwable exc, Void att) {
@@ -332,7 +332,7 @@
             // start read operation
             final CountDownLatch latch = new CountDownLatch(1);
             ByteBuffer buf = ByteBuffer.allocate(1);
-            Future<Integer> res = ch.read(buf, null,
+            Future<Integer> res = ch.read(buf, (Void)null,
                 new CompletionHandler<Integer,Void>() {
                     public void completed(Integer result, Void att) {
                     }
@@ -397,11 +397,11 @@
         // reads should complete immediately
         final ByteBuffer dst = ByteBuffer.allocateDirect(src.capacity() + 100);
         final CountDownLatch latch = new CountDownLatch(1);
-        ch.read(dst, null, new CompletionHandler<Integer,Void>() {
+        ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer result, Void att) {
                 int n = result;
                 if (n > 0) {
-                    ch.read(dst, null, this);
+                    ch.read(dst, (Void)null, this);
                 } else {
                     latch.countDown();
                 }
@@ -450,10 +450,10 @@
         // read until the buffer is full
         final ByteBuffer dst = ByteBuffer.allocateDirect(src.capacity());
         final CountDownLatch latch = new CountDownLatch(1);
-        ch.read(dst, null, new CompletionHandler<Integer,Void>() {
+        ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer result, Void att) {
                 if (dst.hasRemaining()) {
-                    ch.read(dst, null, this);
+                    ch.read(dst, (Void)null, this);
                 } else {
                     latch.countDown();
                 }
@@ -508,7 +508,7 @@
 
         // scattering read that completes ascynhronously
         final CountDownLatch latch = new CountDownLatch(1);
-        ch.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, null,
+        ch.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, (Void)null,
             new CompletionHandler<Long,Void>() {
                 public void completed(Long result, Void att) {
                     long n = result;
@@ -536,7 +536,7 @@
             dsts[i].rewind();
         }
         long n = ch
-            .read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, null, null).get();
+            .read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, (Void)null, null).get();
         if (n <= 0)
             throw new RuntimeException("No bytes read");
 
@@ -562,10 +562,10 @@
 
         // write all bytes and close connection when done
         final ByteBuffer src = genBuffer();
-        ch.write(src, null, new CompletionHandler<Integer,Void>() {
+        ch.write(src, (Void)null, new CompletionHandler<Integer,Void>() {
             public void completed(Integer result, Void att) {
                 if (src.hasRemaining()) {
-                    ch.write(src, null, this);
+                    ch.write(src, (Void)null, this);
                 } else {
                     try {
                         ch.close();
@@ -616,7 +616,7 @@
         // write buffers (should complete immediately)
         ByteBuffer[] srcs = genBuffers(1);
         long n = ch
-            .write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, null, null).get();
+            .write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, (Void)null, null).get();
         if (n <= 0)
             throw new RuntimeException("No bytes written");
 
@@ -629,7 +629,7 @@
         // write until socket buffer is full so as to create the conditions
         // for when a write does not complete immediately
         srcs = genBuffers(1);
-        ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, null,
+        ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, (Void)null,
             new CompletionHandler<Long,Void>() {
                 public void completed(Long result, Void att) {
                     long n = result;
@@ -639,7 +639,7 @@
                     if (continueWriting.get()) {
                         ByteBuffer[] srcs = genBuffers(8);
                         ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS,
-                            null, this);
+                            (Void)null, this);
                     }
                 }
                 public void failed(Throwable exc, Void att) {
@@ -717,7 +717,7 @@
         // this read should timeout
         ByteBuffer dst = ByteBuffer.allocate(512);
         try {
-            ch.read(dst, 3, TimeUnit.SECONDS, null, null).get();
+            ch.read(dst, 3, TimeUnit.SECONDS, (Void)null, null).get();
             throw new RuntimeException("Read did not timeout");
         } catch (ExecutionException x) {
             if (!(x.getCause() instanceof InterruptedByTimeoutException))
--- a/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java	Mon Jul 27 22:28:29 2009 -0700
@@ -99,7 +99,7 @@
         void start() {
             sentBuffer.position(0);
             sentBuffer.limit(sentBuffer.capacity());
-            channel.write(sentBuffer, null, new CompletionHandler<Integer,Void> () {
+            channel.write(sentBuffer, (Void)null, new CompletionHandler<Integer,Void> () {
                 public void completed(Integer nwrote, Void att) {
                     bytesSent += nwrote;
                     if (finished) {
@@ -107,7 +107,7 @@
                     } else {
                         sentBuffer.position(0);
                         sentBuffer.limit(sentBuffer.capacity());
-                        channel.write(sentBuffer, null, this);
+                        channel.write(sentBuffer, (Void)null, this);
                     }
                 }
                 public void failed(Throwable exc, Void att) {
@@ -142,14 +142,14 @@
         }
 
         void start() {
-            channel.read(readBuffer, null, new CompletionHandler<Integer,Void> () {
+            channel.read(readBuffer, (Void)null, new CompletionHandler<Integer,Void> () {
                 public void completed(Integer nread, Void att) {
                     if (nread < 0) {
                         closeUnchecked(channel);
                     } else {
                         bytesRead += nread;
                         readBuffer.clear();
-                        channel.read(readBuffer, null, this);
+                        channel.read(readBuffer, (Void)null, this);
                     }
                 }
                 public void failed(Throwable exc, Void att) {
--- a/test/java/nio/file/Path/Links.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/java/nio/file/Path/Links.java	Mon Jul 27 22:28:29 2009 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 6838333
+ * @bug 4313887 6838333 6863864
  * @summary Unit test for java.nio.file.Path createSymbolicLink,
  *     readSymbolicLink, and createLink methods
  * @library ..
@@ -31,7 +31,6 @@
 import java.nio.file.*;
 import java.nio.file.attribute.*;
 import java.io.*;
-import java.util.*;
 
 public class Links {
 
@@ -47,7 +46,7 @@
      * Exercise createSymbolicLink and readLink methods
      */
     static void testSymLinks(Path dir) throws IOException {
-        Path link = dir.resolve("link");
+        final Path link = dir.resolve("link");
 
         // Check if sym links are supported
         try {
@@ -76,6 +75,63 @@
                 link.delete();
             }
         }
+
+        // Test links to directory
+        Path mydir = dir.resolve("mydir");
+        Path myfile = mydir.resolve("myfile");
+        try {
+            mydir.createDirectory();
+            myfile.createFile();
+
+            // link -> "mydir"
+            link.createSymbolicLink(mydir.getName());
+            assertTrue(link.readSymbolicLink().equals(mydir.getName()));
+
+            // Test access to directory via link
+            DirectoryStream<Path> stream = link.newDirectoryStream();
+            try {
+                boolean found = false;
+                for (Path entry: stream) {
+                    if (entry.getName().equals(myfile.getName())) {
+                        found = true;
+                        break;
+                    }
+                }
+                assertTrue(found);
+            } finally {
+                stream.close();
+            }
+
+            // Test link2 -> link -> mydir
+            final Path link2 = dir.resolve("link2");
+            Path target2 = link.getName();
+            link2.createSymbolicLink(target2);
+            try {
+                assertTrue(link2.readSymbolicLink().equals(target2));
+                link2.newDirectoryStream().close();
+            } finally {
+                link2.delete();
+            }
+
+            // Remove mydir and re-create link2 before re-creating mydir
+            // (This is a useful test on Windows to ensure that creating a
+            // sym link to a directory sym link creates the right type of link).
+            myfile.delete();
+            mydir.delete();
+            link2.createSymbolicLink(target2);
+            try {
+                assertTrue(link2.readSymbolicLink().equals(target2));
+                mydir.createDirectory();
+                link2.newDirectoryStream().close();
+            } finally {
+                link2.delete();
+            }
+
+        } finally {
+            myfile.deleteIfExists();
+            mydir.deleteIfExists();
+            link.deleteIfExists();
+        }
     }
 
     /**
--- a/test/sun/security/krb5/ConfPlusProp.java	Tue Jul 21 13:06:30 2009 -0700
+++ b/test/sun/security/krb5/ConfPlusProp.java	Mon Jul 27 22:28:29 2009 -0700
@@ -23,31 +23,56 @@
 /*
  * @test
  * @bug 6857795
+ * @buf 6858589
  * @summary krb5.conf ignored if system properties on realm and kdc are provided
  */
 
 import sun.security.krb5.Config;
-import sun.security.krb5.KrbException;
 
 public class ConfPlusProp {
+    Config config;
     public static void main(String[] args) throws Exception {
-        System.setProperty("java.security.krb5.realm", "R2");
-        System.setProperty("java.security.krb5.kdc", "k2");
+        new ConfPlusProp().run();
+    }
+
+    void refresh() throws Exception {
+        Config.refresh();
+        config = Config.getInstance();
+    }
+
+    void checkDefaultRealm(String r) throws Exception {
+        try {
+            if (!config.getDefaultRealm().equals(r)) {
+                throw new AssertionError("Default realm error");
+            }
+        } catch (Exception e) {
+            if (r != null) throw e;
+        }
+    }
+
+    void check(String r, String k) throws Exception {
+        try {
+            if (!config.getKDCList(r).equals(k)) {
+                throw new AssertionError(r + " kdc not " + k);
+            }
+        } catch (Exception e) {
+            if (k != null) throw e;
+        }
+    }
+
+    void run() throws Exception {
+
+        // No prop, only conf
 
         // Point to a file with existing default_realm
         System.setProperty("java.security.krb5.conf",
                 System.getProperty("test.src", ".") +"/confplusprop.conf");
-        Config config = Config.getInstance();
+        refresh();
 
-        if (!config.getDefaultRealm().equals("R2")) {
-            throw new Exception("Default realm error");
-        }
-        if (!config.getKDCList("R1").equals("k1")) {
-            throw new Exception("R1 kdc error");
-        }
-        if (!config.getKDCList("R2").equals("k2")) {
-            throw new Exception("R2 kdc error");
-        }
+        checkDefaultRealm("R1");
+        check("R1", "k1");
+        check("R2", "old");
+        check("R3", null);
         if (!config.getDefault("forwardable", "libdefaults").equals("well")) {
             throw new Exception("Extra config error");
         }
@@ -55,38 +80,66 @@
         // Point to a file with no libdefaults
         System.setProperty("java.security.krb5.conf",
                 System.getProperty("test.src", ".") +"/confplusprop2.conf");
-        Config.refresh();
+        refresh();
 
-        config = Config.getInstance();
+        checkDefaultRealm(null);
+        check("R1", "k12");
+        check("R2", "old");
+        check("R3", null);
 
-        if (!config.getDefaultRealm().equals("R2")) {
-            throw new Exception("Default realm error again");
+        int version = System.getProperty("java.version").charAt(2) - '0';
+        System.out.println("JDK version is " + version);
+
+        // Zero-config is supported since 1.7
+        if (version >= 7) {
+            // Point to a non-existing file
+            System.setProperty("java.security.krb5.conf", "i-am-not-a file");
+            refresh();
+
+            checkDefaultRealm(null);
+            check("R1", null);
+            check("R2", null);
+            check("R3", null);
+            if (config.getDefault("forwardable", "libdefaults") != null) {
+                throw new Exception("Extra config error");
+            }
         }
-        if (!config.getKDCList("R1").equals("k12")) {
-            throw new Exception("R1 kdc error");
+
+        // Add prop
+        System.setProperty("java.security.krb5.realm", "R2");
+        System.setProperty("java.security.krb5.kdc", "k2");
+
+        // Point to a file with existing default_realm
+        System.setProperty("java.security.krb5.conf",
+                System.getProperty("test.src", ".") +"/confplusprop.conf");
+        refresh();
+
+        checkDefaultRealm("R2");
+        check("R1", "k1");
+        check("R2", "k2");
+        check("R3", "k2");
+        if (!config.getDefault("forwardable", "libdefaults").equals("well")) {
+            throw new Exception("Extra config error");
         }
-        if (!config.getKDCList("R2").equals("k2")) {
-            throw new Exception("R2 kdc error");
-        }
+
+        // Point to a file with no libdefaults
+        System.setProperty("java.security.krb5.conf",
+                System.getProperty("test.src", ".") +"/confplusprop2.conf");
+        refresh();
+
+        checkDefaultRealm("R2");
+        check("R1", "k12");
+        check("R2", "k2");
+        check("R3", "k2");
 
         // Point to a non-existing file
         System.setProperty("java.security.krb5.conf", "i-am-not-a file");
-        Config.refresh();
+        refresh();
 
-        config = Config.getInstance();
-
-        if (!config.getDefaultRealm().equals("R2")) {
-            throw new Exception("Default realm error");
-        }
-        try {
-            config.getKDCList("R1");
-            throw new Exception("R1 is nowhere");
-        } catch (KrbException ke) {
-            // OK
-        }
-        if (!config.getKDCList("R2").equals("k2")) {
-            throw new Exception("R2 kdc error");
-        }
+        checkDefaultRealm("R2");
+        check("R1", "k2");
+        check("R2", "k2");
+        check("R3", "k2");
         if (config.getDefault("forwardable", "libdefaults") != null) {
             throw new Exception("Extra config error");
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/security/tools/jarsigner/newsize7.sh	Mon Jul 27 22:28:29 2009 -0700
@@ -0,0 +1,73 @@
+#
+# Copyright 2009 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 6561126
+# @summary keytool should use larger default keysize for keypairs
+#
+# @run shell newsize7.sh
+
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+if [ "${TESTSRC}" = "" ] ; then
+   TESTSRC="."
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+  JAVA_CMD=`which java`
+  TESTJAVA=`dirname $JAVA_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  Windows_* )
+    FS="\\"
+    ;;
+  * )
+    FS="/"
+    ;;
+esac
+
+KSFILE=ns7.jks
+
+KT="${TESTJAVA}${FS}bin${FS}keytool -keystore ns7.jks -storepass changeit -keypass changeit"
+JAR="${TESTJAVA}${FS}bin${FS}jar"
+JS="${TESTJAVA}${FS}bin${FS}jarsigner -keystore ns7.jks -storepass changeit"
+
+rm ns7.*
+
+$KT -genkeypair -alias me -dname CN=Me
+
+touch ns7.txt
+$JAR cvf ns7.jar ns7.txt
+
+$JS ns7.jar me
+$JAR xvf ns7.jar
+
+grep SHA-256 META-INF/MANIFEST.MF || exit 1
+grep SHA-256 META-INF/ME.SF || exit 2
+
+#rm -rf META-INF
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/security/tools/keytool/NewSize7.java	Mon Jul 27 22:28:29 2009 -0700
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2009 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 6561126
+ * @summary keytool should use larger default keysize for keypairs
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.RSAPublicKey;
+import sun.security.tools.KeyTool;
+
+public class NewSize7 {
+    public static void main(String[] args) throws Exception {
+        String FILE = "newsize7-ks";
+        new File(FILE).delete();
+        KeyTool.main(("-debug -genkeypair -keystore " + FILE +
+                " -alias a -dname cn=c -storepass changeit" +
+                " -keypass changeit -keyalg rsa").split(" "));
+        KeyStore ks = KeyStore.getInstance("JKS");
+        ks.load(new FileInputStream(FILE), null);
+        new File(FILE).delete();
+        RSAPublicKey r = (RSAPublicKey)ks.getCertificate("a").getPublicKey();
+        if (r.getModulus().bitLength() != 2048) {
+            throw new Exception("Bad keysize");
+        }
+        X509Certificate x = (X509Certificate)ks.getCertificate("a");
+        if (!x.getSigAlgName().equals("SHA256withRSA")) {
+            throw new Exception("Bad sigalg");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/security/tools/keytool/emptysubject.sh	Mon Jul 27 22:28:29 2009 -0700
@@ -0,0 +1,68 @@
+#
+# Copyright 2009 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 6847026
+# @summary keytool should be able to generate certreq and cert without subject name
+#
+# @run shell emptysubject.sh
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+  JAVAC_CMD=`which javac`
+  TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+  Windows_* )
+    FS="\\"
+    ;;
+  * )
+    FS="/"
+    ;;
+esac
+
+KS=emptysubject.jks
+KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS"
+
+rm $KS
+
+$KT -alias ca -dname CN=CA -genkeypair
+$KT -alias me -dname CN=Me -genkeypair
+
+# When -dname is recognized, SAN must be specfied, otherwise, -printcert fails.
+$KT -alias me -certreq -dname "" | \
+        $KT -alias ca -gencert | $KT -printcert && exit 1
+$KT -alias me -certreq | \
+        $KT -alias ca -gencert -dname "" | $KT -printcert && exit 2
+$KT -alias me -certreq -dname "" | \
+        $KT -alias ca -gencert -ext san:c=email:me@me.com | \
+        $KT -printcert || exit 3
+$KT -alias me -certreq | \
+        $KT -alias ca -gencert -dname "" -ext san:c=email:me@me.com | \
+        $KT -printcert || exit 4
+
+exit 0
+