# HG changeset patch # User asaha # Date 1269526363 25200 # Node ID d6b7fa6e317f997f31c2713685d63d70645ef9f9 # Parent dcc229e35a4e697a2abff22281854539afbc9ca6# Parent 5693cc1e95c65d84a343f7e96703e6c65770992f Merge diff -r dcc229e35a4e -r d6b7fa6e317f jdk/src/share/classes/sun/security/provider/X509Factory.java --- a/jdk/src/share/classes/sun/security/provider/X509Factory.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/src/share/classes/sun/security/provider/X509Factory.java Thu Mar 25 07:12:43 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package sun.security.provider; import java.io.*; -import java.util.Collection; import java.util.*; import java.security.cert.*; import sun.security.x509.X509CertImpl; @@ -37,6 +36,7 @@ import sun.security.util.DerValue; import sun.security.util.Cache; import sun.misc.BASE64Decoder; +import sun.security.pkcs.ParsingException; /** * This class defines a certificate factory for X.509 v3 certificates & @@ -62,10 +62,6 @@ public static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----"; public static final String END_CERT = "-----END CERTIFICATE-----"; - private static final int defaultExpectedLineLength = 80; - - private static final char[] endBoundary = "-----END".toCharArray(); - private static final int ENC_MAX_LENGTH = 4096 * 1024; // 4 MB MAX private static final Cache certCache = Cache.newSoftMemoryCache(750); @@ -92,13 +88,7 @@ throw new CertificateException("Missing input stream"); } try { - if (is.markSupported() == false) { - // consume the entire input stream - byte[] totalBytes; - totalBytes = getTotalBytes(new BufferedInputStream(is)); - is = new ByteArrayInputStream(totalBytes); - } - byte[] encoding = readSequence(is); + byte[] encoding = readOneBlock(is); if (encoding != null) { X509CertImpl cert = (X509CertImpl)getFromCache(certCache, encoding); if (cert != null) { @@ -108,19 +98,7 @@ addToCache(certCache, cert.getEncodedInternal(), cert); return cert; } else { - X509CertImpl cert; - // determine if binary or Base64 encoding. If Base64 encoding, - // the certificate must be bounded at the beginning by - // "-----BEGIN". - if (isBase64(is)) { - // Base64 - byte[] data = base64_to_binary(is); - cert = new X509CertImpl(data); - } else { - // binary - cert = new X509CertImpl(new DerValue(is)); - } - return intern(cert); + throw new IOException("Empty input"); } } catch (IOException ioe) { throw (CertificateException)new CertificateException @@ -129,73 +107,21 @@ } /** - * Read a DER SEQUENCE from an InputStream and return the encoding. - * If data does not represent a SEQUENCE, it uses indefinite length - * encoding, or is longer than ENC_MAX_LENGTH, the stream is reset - * and this method returns null. - */ - private static byte[] readSequence(InputStream in) throws IOException { - in.mark(ENC_MAX_LENGTH); - byte[] b = new byte[4]; - int i = readFully(in, b, 0, b.length); - if ((i != b.length) || (b[0] != 0x30)) { // first byte must be SEQUENCE - in.reset(); - return null; - } - i = b[1] & 0xff; - int totalLength; - if (i < 0x80) { - int valueLength = i; - totalLength = valueLength + 2; - } else if (i == 0x81) { - int valueLength = b[2] & 0xff; - totalLength = valueLength + 3; - } else if (i == 0x82) { - int valueLength = ((b[2] & 0xff) << 8) | (b[3] & 0xff); - totalLength = valueLength + 4; - } else { // ignore longer length forms - in.reset(); - return null; - } - if (totalLength > ENC_MAX_LENGTH) { - in.reset(); - return null; - } - byte[] encoding = new byte[totalLength]; - if( totalLength < b.length ) { - in.reset(); - i = readFully(in, encoding, 0, totalLength); - if( i != totalLength ) { - in.reset(); - return null; - } - } else { - System.arraycopy(b, 0, encoding, 0, b.length); - int n = totalLength - b.length; - i = readFully(in, encoding, b.length, n); - if (i != n) { - in.reset(); - return null; - } - } - return encoding; - } - - /** * Read from the stream until length bytes have been read or EOF has * been reached. Return the number of bytes actually read. */ - private static int readFully(InputStream in, byte[] buffer, int offset, + private static int readFully(InputStream in, ByteArrayOutputStream bout, int length) throws IOException { int read = 0; + byte[] buffer = new byte[2048]; while (length > 0) { - int n = in.read(buffer, offset, length); + int n = in.read(buffer, 0, length<2048?length:2048); if (n <= 0) { break; } + bout.write(buffer, 0, n); read += n; length -= n; - offset += n; } return read; } @@ -309,21 +235,11 @@ throw new CertificateException("Missing input stream"); } try { - if (inStream.markSupported() == false) { - // consume the entire input stream - byte[] totalBytes; - totalBytes = getTotalBytes(new BufferedInputStream(inStream)); - inStream = new ByteArrayInputStream(totalBytes); - } - // determine if binary or Base64 encoding. If Base64 encoding, - // each certificate must be bounded at the beginning by - // "-----BEGIN". - if (isBase64(inStream)) { - // Base64 - byte[] data = base64_to_binary(inStream); - return new X509CertPath(new ByteArrayInputStream(data)); + byte[] encoding = readOneBlock(inStream); + if (encoding != null) { + return new X509CertPath(new ByteArrayInputStream(encoding)); } else { - return new X509CertPath(inStream); + throw new IOException("Empty input"); } } catch (IOException ioe) { throw new CertificateException(ioe.getMessage()); @@ -350,21 +266,11 @@ throw new CertificateException("Missing input stream"); } try { - if (inStream.markSupported() == false) { - // consume the entire input stream - byte[] totalBytes; - totalBytes = getTotalBytes(new BufferedInputStream(inStream)); - inStream = new ByteArrayInputStream(totalBytes); - } - // determine if binary or Base64 encoding. If Base64 encoding, - // each certificate must be bounded at the beginning by - // "-----BEGIN". - if (isBase64(inStream)) { - // Base64 - byte[] data = base64_to_binary(inStream); + byte[] data = readOneBlock(inStream); + if (data != null) { return new X509CertPath(new ByteArrayInputStream(data), encoding); } else { - return(new X509CertPath(inStream, encoding)); + throw new IOException("Empty input"); } } catch (IOException ioe) { throw new CertificateException(ioe.getMessage()); @@ -426,11 +332,6 @@ throw new CertificateException("Missing input stream"); } try { - if (is.markSupported() == false) { - // consume the entire input stream - is = new ByteArrayInputStream - (getTotalBytes(new BufferedInputStream(is))); - } return parseX509orPKCS7Cert(is); } catch (IOException ioe) { throw new CertificateException(ioe); @@ -458,13 +359,7 @@ throw new CRLException("Missing input stream"); } try { - if (is.markSupported() == false) { - // consume the entire input stream - byte[] totalBytes; - totalBytes = getTotalBytes(new BufferedInputStream(is)); - is = new ByteArrayInputStream(totalBytes); - } - byte[] encoding = readSequence(is); + byte[] encoding = readOneBlock(is); if (encoding != null) { X509CRLImpl crl = (X509CRLImpl)getFromCache(crlCache, encoding); if (crl != null) { @@ -474,19 +369,7 @@ addToCache(crlCache, crl.getEncodedInternal(), crl); return crl; } else { - X509CRLImpl crl; - // determine if binary or Base64 encoding. If Base64 encoding, - // the CRL must be bounded at the beginning by - // "-----BEGIN". - if (isBase64(is)) { - // Base64 - byte[] data = base64_to_binary(is); - crl = new X509CRLImpl(data); - } else { - // binary - crl = new X509CRLImpl(new DerValue(is)); - } - return intern(crl); + throw new IOException("Empty input"); } } catch (IOException ioe) { throw new CRLException(ioe.getMessage()); @@ -504,19 +387,13 @@ * * @exception CRLException on parsing errors. */ - public Collection engineGenerateCRLs(InputStream -is) - throws CRLException + public Collection engineGenerateCRLs( + InputStream is) throws CRLException { if (is == null) { throw new CRLException("Missing input stream"); } try { - if (is.markSupported() == false) { - // consume the entire input stream - is = new ByteArrayInputStream - (getTotalBytes(new BufferedInputStream(is))); - } return parseX509orPKCS7CRL(is); } catch (IOException ioe) { throw new CRLException(ioe.getMessage()); @@ -533,42 +410,25 @@ throws CertificateException, IOException { Collection coll = new ArrayList(); - boolean first = true; - while (is.available() != 0) { - // determine if binary or Base64 encoding. If Base64 encoding, - // each certificate must be bounded at the beginning by - // "-----BEGIN". - InputStream is2 = is; - if (isBase64(is2)) { - // Base64 - is2 = new ByteArrayInputStream(base64_to_binary(is2)); + byte[] data = readOneBlock(is); + if (data == null) { + return new ArrayList(0); + } + try { + PKCS7 pkcs7 = new PKCS7(data); + X509Certificate[] certs = pkcs7.getCertificates(); + // certs are optional in PKCS #7 + if (certs != null) { + return Arrays.asList(certs); + } else { + // no crls provided + return new ArrayList(0); } - if (first) - is2.mark(is2.available()); - try { - // treat as X.509 cert - coll.add(intern(new X509CertImpl(new DerValue(is2)))); - } catch (CertificateException e) { - Throwable cause = e.getCause(); - // only treat as PKCS#7 if this is the first cert parsed - // and the root cause of the decoding failure is an IOException - if (first && cause != null && (cause instanceof IOException)) { - // treat as PKCS#7 - is2.reset(); - PKCS7 pkcs7 = new PKCS7(is2); - X509Certificate[] certs = pkcs7.getCertificates(); - // certs are optional in PKCS #7 - if (certs != null) { - return Arrays.asList(certs); - } else { - // no certs provided - return new ArrayList(0); - } - } else { - throw e; - } + } catch (ParsingException e) { + while (data != null) { + coll.add(new X509CertImpl(data)); + data = readOneBlock(is); } - first = false; } return coll; } @@ -583,162 +443,215 @@ throws CRLException, IOException { Collection coll = new ArrayList(); - boolean first = true; - while (is.available() != 0) { - // determine if binary or Base64 encoding. If Base64 encoding, - // the CRL must be bounded at the beginning by - // "-----BEGIN". - InputStream is2 = is; - if (isBase64(is)) { - // Base64 - is2 = new ByteArrayInputStream(base64_to_binary(is2)); + byte[] data = readOneBlock(is); + if (data == null) { + return new ArrayList(0); + } + try { + PKCS7 pkcs7 = new PKCS7(data); + X509CRL[] crls = pkcs7.getCRLs(); + // CRLs are optional in PKCS #7 + if (crls != null) { + return Arrays.asList(crls); + } else { + // no crls provided + return new ArrayList(0); } - if (first) - is2.mark(is2.available()); - try { - // treat as X.509 CRL - coll.add(new X509CRLImpl(is2)); - } catch (CRLException e) { - // only treat as PKCS#7 if this is the first CRL parsed - if (first) { - is2.reset(); - PKCS7 pkcs7 = new PKCS7(is2); - X509CRL[] crls = pkcs7.getCRLs(); - // CRLs are optional in PKCS #7 - if (crls != null) { - return Arrays.asList(crls); - } else { - // no crls provided - return new ArrayList(0); - } - } + } catch (ParsingException e) { + while (data != null) { + coll.add(new X509CRLImpl(data)); + data = readOneBlock(is); } - first = false; } return coll; } - /* - * Converts a Base64-encoded X.509 certificate or X.509 CRL or PKCS#7 data - * to binary encoding. - * In all cases, the data must be bounded at the beginning by - * "-----BEGIN", and must be bounded at the end by "-----END". + /** + * Returns an ASN.1 SEQUENCE from a stream, which might be a BER-encoded + * binary block or a PEM-style BASE64-encoded ASCII data. In the latter + * case, it's de-BASE64'ed before return. + * + * After the reading, the input stream pointer is after the BER block, or + * after the newline character after the -----END SOMETHING----- line. + * + * @param is the InputStream + * @returns byte block or null if end of stream + * @throws IOException If any parsing error */ - private byte[] base64_to_binary(InputStream is) - throws IOException - { - long len = 0; // total length of base64 encoding, including boundaries - - is.mark(is.available()); - - BufferedInputStream bufin = new BufferedInputStream(is); - BufferedReader br = - new BufferedReader(new InputStreamReader(bufin, "ASCII")); + private static byte[] readOneBlock(InputStream is) throws IOException { - // First read all of the data that is found between - // the "-----BEGIN" and "-----END" boundaries into a buffer. - String temp; - while (true) { - temp=readLine(br); - if (temp == null) { - throw new IOException("Unsupported encoding"); + // The first character of a BLOCK. + int c = is.read(); + if (c == -1) { + return null; + } + if (c == DerValue.tag_Sequence) { + ByteArrayOutputStream bout = new ByteArrayOutputStream(2048); + bout.write(c); + readBERInternal(is, bout, c); + return bout.toByteArray(); + } else { + // Read BASE64 encoded data, might skip info at the beginning + char[] data = new char[2048]; + int pos = 0; + + // Step 1: Read until header is found + int hyphen = (c=='-') ? 1: 0; // count of consequent hyphens + int last = (c=='-') ? -1: c; // the char before hyphen + while (true) { + int next = is.read(); + if (next == -1) { + // We accept useless data after the last block, + // say, empty lines. + return null; + } + if (next == '-') { + hyphen++; + } else { + hyphen = 0; + last = next; + } + if (hyphen == 5 && (last==-1 || last=='\r' || last=='\n')) { + break; + } } - len += temp.length(); - if (temp.startsWith("-----BEGIN")) { - break; - } - } - StringBuffer strBuf = new StringBuffer(); - while ((temp=readLine(br))!=null && !temp.startsWith("-----END")) { - strBuf.append(temp); - } - if (temp == null) { - throw new IOException("Unsupported encoding"); - } else { - len += temp.length(); - } - // consume only as much as was needed - len += strBuf.length(); - is.reset(); - is.skip(len); - - // Now, that data is supposed to be a single X.509 certificate or - // X.509 CRL or PKCS#7 formatted data... Base64 encoded. - // Decode into binary and return the result. - BASE64Decoder decoder = new BASE64Decoder(); - return decoder.decodeBuffer(strBuf.toString()); - } + // Step 2: Read the rest of header, determine the line end + int end; + while (true) { + int next = is.read(); + if (next == -1) { + throw new IOException("Incomplete data"); + } + if (next == '\n') { + end = '\n'; + break; + } + if (next == '\r') { + next = is.read(); + if (next == -1) { + throw new IOException("Incomplete data"); + } + if (next == '\n') { + end = '\n'; + } else { + end = '\r'; + data[pos++] = (char)next; + } + break; + } + } - /* - * Reads the entire input stream into a byte array. - */ - private byte[] getTotalBytes(InputStream is) throws IOException { - byte[] buffer = new byte[8192]; - ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); - int n; - baos.reset(); - while ((n = is.read(buffer, 0, buffer.length)) != -1) { - baos.write(buffer, 0, n); - } - return baos.toByteArray(); - } + // Step 3: Read the data + while (true) { + int next = is.read(); + if (next == -1) { + throw new IOException("Incomplete data"); + } + if (next != '-') { + data[pos++] = (char)next; + if (pos >= data.length) { + data = Arrays.copyOf(data, data.length+1024); + } + } else { + break; + } + } - /* - * Determines if input is binary or Base64 encoded. - */ - private boolean isBase64(InputStream is) throws IOException { - if (is.available() >= 1) { - is.mark(1); - int c1 = is.read(); - is.reset(); - if (c1 != DerValue.tag_Sequence) { - return true; - } else { - return false; + // Step 4: Consume the footer + while (true) { + int next = is.read(); + // Add next == '\n' for maximum safety, in case endline + // is not consistent. + if (next == -1 || next == end || next == '\n') { + break; + } } - } else { - return false; + + BASE64Decoder decoder = new BASE64Decoder(); + return decoder.decodeBuffer(new String(data, 0, pos)); } } - /* - * Read a line of text. A line is considered to be terminated by any one - * of a line feed ('\n'), a carriage return ('\r'), a carriage return - * followed immediately by a linefeed, or an end-of-certificate marker. + /** + * Read one BER data block. This method is aware of indefinite-length BER + * encoding and will read all of the sub-sections in a recursive way * - * @return A String containing the contents of the line, including - * any line-termination characters, or null if the end of the - * stream has been reached. + * @param is Read from this InputStream + * @param bout Write into this OutputStream + * @param tag Tag already read (-1 mean not read) + * @returns The current tag, used to check EOC in indefinite-length BER + * @throws IOException Any parsing error */ - private String readLine(BufferedReader br) throws IOException { - int c; - int i = 0; - boolean isMatch = true; - boolean matched = false; - StringBuffer sb = new StringBuffer(defaultExpectedLineLength); - do { - c = br.read(); - if (isMatch && (i < endBoundary.length)) { - isMatch = ((char)c != endBoundary[i++]) ? false : true; + private static int readBERInternal(InputStream is, + ByteArrayOutputStream bout, int tag) throws IOException { + + if (tag == -1) { // Not read before the call, read now + tag = is.read(); + if (tag == -1) { + throw new IOException("BER/DER tag info absent"); + } + if ((tag & 0x1f) == 0x1f) { + throw new IOException("Multi octets tag not supported"); + } + bout.write(tag); + } + + int n = is.read(); + if (n == -1) { + throw new IOException("BER/DER length info ansent"); + } + bout.write(n); + + int length; + + if (n == 0x80) { // Indefinite-length encoding + if ((tag & 0x20) != 0x20) { + throw new IOException( + "Non constructed encoding must have definite length"); + } + while (true) { + int subTag = readBERInternal(is, bout, -1); + if (subTag == 0) { // EOC, end of indefinite-length section + break; + } } - if (!matched) - matched = (isMatch && (i == endBoundary.length)); - sb.append((char)c); - } while ((c != -1) && (c != '\n') && (c != '\r')); - - if (!matched && c == -1) { - return null; - } - if (c == '\r') { - br.mark(1); - int c2 = br.read(); - if (c2 == '\n') { - sb.append((char)c); - } else { - br.reset(); + } else { + if (n < 0x80) { + length = n; + } else if (n == 0x81) { + length = is.read(); + if (length == -1) { + throw new IOException("Incomplete BER/DER length info"); + } + bout.write(length); + } else if (n == 0x82) { + int highByte = is.read(); + int lowByte = is.read(); + if (lowByte == -1) { + throw new IOException("Incomplete BER/DER length info"); + } + bout.write(highByte); + bout.write(lowByte); + length = (highByte << 8) | lowByte; + } else if (n == 0x83) { + int highByte = is.read(); + int midByte = is.read(); + int lowByte = is.read(); + if (lowByte == -1) { + throw new IOException("Incomplete BER/DER length info"); + } + bout.write(highByte); + bout.write(midByte); + bout.write(lowByte); + length = (highByte << 16) | (midByte << 8) | lowByte; + } else { // ignore longer length forms + throw new IOException("Invalid BER/DER data (too huge?)"); + } + if (readFully(is, bout, length) != length) { + throw new IOException("Incomplete BER/DER data"); } } - return sb.toString(); + return tag; } } diff -r dcc229e35a4e -r d6b7fa6e317f jdk/src/share/classes/sun/security/tools/KeyTool.java --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java Thu Mar 25 07:12:43 2010 -0700 @@ -977,46 +977,35 @@ if (filename != null) { inStream = new FileInputStream(filename); } - // Read the full stream before feeding to X509Factory, - // otherwise, keytool -gencert | keytool -importcert - // might not work properly, since -gencert is slow - // and there's no data in the pipe at the beginning. - ByteArrayOutputStream bout = new ByteArrayOutputStream(); + String importAlias = (alias!=null)?alias:keyAlias; try { - byte[] b = new byte[4096]; - while (true) { - int len = inStream.read(b); - if (len < 0) break; - bout.write(b, 0, len); + if (keyStore.entryInstanceOf( + importAlias, KeyStore.PrivateKeyEntry.class)) { + kssave = installReply(importAlias, inStream); + if (kssave) { + System.err.println(rb.getString + ("Certificate reply was installed in keystore")); + } else { + System.err.println(rb.getString + ("Certificate reply was not installed in keystore")); + } + } else if (!keyStore.containsAlias(importAlias) || + keyStore.entryInstanceOf(importAlias, + KeyStore.TrustedCertificateEntry.class)) { + kssave = addTrustedCert(importAlias, inStream); + if (kssave) { + System.err.println(rb.getString + ("Certificate was added to keystore")); + } else { + System.err.println(rb.getString + ("Certificate was not added to keystore")); + } } } finally { if (inStream != System.in) { inStream.close(); } } - inStream = new ByteArrayInputStream(bout.toByteArray()); - String importAlias = (alias!=null)?alias:keyAlias; - if (keyStore.entryInstanceOf(importAlias, KeyStore.PrivateKeyEntry.class)) { - kssave = installReply(importAlias, inStream); - if (kssave) { - System.err.println(rb.getString - ("Certificate reply was installed in keystore")); - } else { - System.err.println(rb.getString - ("Certificate reply was not installed in keystore")); - } - } else if (!keyStore.containsAlias(importAlias) || - keyStore.entryInstanceOf(importAlias, - KeyStore.TrustedCertificateEntry.class)) { - kssave = addTrustedCert(importAlias, inStream); - if (kssave) { - System.err.println(rb.getString - ("Certificate was added to keystore")); - } else { - System.err.println(rb.getString - ("Certificate was not added to keystore")); - } - } } else if (command == IMPORTKEYSTORE) { doImportKeyStore(); kssave = true; @@ -2149,18 +2138,7 @@ inStream = new FileInputStream(filename); } try { - // Read the full stream before feeding to X509Factory, - // otherwise, keytool -gencert | keytool -printcert - // might not work properly, since -gencert is slow - // and there's no data in the pipe at the beginning. - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - byte[] b = new byte[4096]; - while (true) { - int len = inStream.read(b); - if (len < 0) break; - bout.write(b, 0, len); - } - printCertFromStream(new ByteArrayInputStream(bout.toByteArray()), out); + printCertFromStream(inStream, out); } finally { if (inStream != System.in) { inStream.close(); diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/ProblemList.txt Thu Mar 25 07:12:43 2010 -0700 @@ -684,8 +684,6 @@ java/net/SocketInputStream/SocketTimeout.java generic-all # Linux i586, address already in use or timeout, samevm issues -java/net/URLConnection/B5052093.java generic-all -java/net/URLConnection/contentHandler/UserContentHandler.java generic-all java/net/URLConnection/DisconnectAfterEOF.java generic-all java/net/URLConnection/HandleContentTypeWithAttrs.java generic-all java/net/URLConnection/Responses.java generic-all @@ -696,8 +694,6 @@ java/net/ResponseCache/B6181108.java generic-all java/net/ResponseCache/ResponseCacheTest.java generic-all java/net/URL/GetContent.java generic-all -java/net/URL/TestIPv6Addresses.java generic-all -java/net/URLClassLoader/HttpTest.java generic-all java/net/URLConnection/HttpContinueStackOverflow.java generic-all java/net/URLConnection/Redirect307Test.java generic-all java/net/URLConnection/RedirectLimit.java generic-all @@ -726,9 +722,6 @@ # Connection refused, windows samevm sun/net/www/protocol/http/DigestTest.java generic-all -# Fails on Fedora 9 32bit & 64bit & Solaris 10, wrong proxy for http://localhost/index.html -java/net/ProxySelector/B6737819.java generic-all - ############################################################################ # jdk_nio diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/ProxySelector/B6737819.java --- a/jdk/test/java/net/ProxySelector/B6737819.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/ProxySelector/B6737819.java Thu Mar 25 07:12:43 2010 -0700 @@ -23,9 +23,15 @@ /* * @test * @bug 6737819 + * @run main/othervm B6737819 * @summary sun.misc.net.DefaultProxySelector doesn't use proxy setting to localhost */ +/* Run in othervm mode since the test sets HTTP proxy system properties that + * are read once and cached by the protocol handler. A previous test using the + * HTTP handler may run and these system properties may be ignored for this test. + */ + import java.net.ProxySelector; import java.net.Proxy; import java.net.URI; diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/ResponseCache/ResponseCacheTest.java --- a/jdk/test/java/net/ResponseCache/ResponseCacheTest.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/ResponseCache/ResponseCacheTest.java Thu Mar 25 07:12:43 2010 -0700 @@ -150,10 +150,14 @@ } } public static void main(String args[]) throws Exception { - ResponseCache.setDefault(new MyResponseCache()); - FNPrefix = System.getProperty("test.src", ".")+"/"; - OutFNPrefix = System.getProperty("test.scratch", ".")+"/"; - new ResponseCacheTest(); + try { + ResponseCache.setDefault(new MyResponseCache()); + FNPrefix = System.getProperty("test.src", ".")+"/"; + OutFNPrefix = System.getProperty("test.scratch", ".")+"/"; + new ResponseCacheTest(); + } finally{ + ResponseCache.setDefault(null); + } } static class MyResponseCache extends ResponseCache { diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/ResponseCache/getResponseCode.java --- a/jdk/test/java/net/ResponseCache/getResponseCode.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/ResponseCache/getResponseCode.java Thu Mar 25 07:12:43 2010 -0700 @@ -30,8 +30,7 @@ import java.net.*; import java.util.*; import java.io.*; -import java.nio.*; -import sun.net.www.ParseUtil; + /** * Request should get serviced by the cache handler. Response get @@ -52,9 +51,13 @@ } } public static void main(String args[]) throws Exception { - ResponseCache.setDefault(new MyResponseCache()); - FNPrefix = System.getProperty("test.src", ".")+"/"; - new getResponseCode(); + try { + ResponseCache.setDefault(new MyResponseCache()); + FNPrefix = System.getProperty("test.src", ".")+"/"; + new getResponseCode(); + } finally{ + ResponseCache.setDefault(null); + } } static class MyResponseCache extends ResponseCache { diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/URL/TestIPv6Addresses.java --- a/jdk/test/java/net/URL/TestIPv6Addresses.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/URL/TestIPv6Addresses.java Thu Mar 25 07:12:43 2010 -0700 @@ -23,8 +23,12 @@ /* @test * @bug 4451522 4460484 + * @run main/othervm TestIPv6Addresses * @summary URI and URL getHost() methods don't comform to RFC 2732 */ + +// Run in othervm because the tests sets a SecurityManager + import java.net.*; public class TestIPv6Addresses { diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/URLClassLoader/HttpTest.java --- a/jdk/test/java/net/URLClassLoader/HttpTest.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/URLClassLoader/HttpTest.java Thu Mar 25 07:12:43 2010 -0700 @@ -56,9 +56,9 @@ } public void run() { + InputStream in = null; try { - - InputStream in = s.getInputStream(); + in = s.getInputStream(); for (;;) { // read entire request from client @@ -111,6 +111,9 @@ } // for } catch (Exception e) { + unexpected(e); + } finally { + if (in != null) { try {in.close(); } catch(IOException e) {unexpected(e);} } } } } @@ -131,6 +134,11 @@ } } + void unexpected(Exception e) { + System.out.println(e); + e.printStackTrace(); + } + public static HttpServer create() throws Exception { if (svr != null) return svr; @@ -211,6 +219,7 @@ // one GET request svr.counters().reset(); InputStream in = cl.getResourceAsStream("foo2.gif"); + in.close(); System.out.println(svr.counters()); if (svr.counters().getCount() > 1) { failed = true; diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/URLConnection/B5052093.java --- a/jdk/test/java/net/URLConnection/B5052093.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/URLConnection/B5052093.java Thu Mar 25 07:12:43 2010 -0700 @@ -1,12 +1,10 @@ /* - * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007 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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. + * 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 @@ -66,17 +64,29 @@ public static void main(String[] args) throws Exception { server = new HttpServer(new B5052093(), 1, 10, 0); - URL url = new URL("http://localhost:"+server.getLocalPort()+"/foo"); - URLConnection conn = url.openConnection(); - int i = conn.getContentLength(); - long l = conn.getContentLengthLong(); - if (i != -1 || l != testSize) - throw new RuntimeException("Wrong content-length from http"); + try { + URL url = new URL("http://localhost:"+server.getLocalPort()+"/foo"); + URLConnection conn = url.openConnection(); + int i = conn.getContentLength(); + long l = conn.getContentLengthLong(); + if (i != -1 || l != testSize) { + System.out.println("conn.getContentLength = " + i); + System.out.println("conn.getContentLengthLong = " + l); + System.out.println("testSize = " + testSize); + throw new RuntimeException("Wrong content-length from http"); + } - URLConnection fu = new LargeFileURLConnection(new LargeFile()); - i = fu.getContentLength(); - l = fu.getContentLengthLong(); - if (i != -1 || l != testSize) - throw new RuntimeException("Wrong content-length from file"); + URLConnection fu = new LargeFileURLConnection(new LargeFile()); + i = fu.getContentLength(); + l = fu.getContentLengthLong(); + if (i != -1 || l != testSize) { + System.out.println("fu.getContentLength = " + i); + System.out.println("fu.getContentLengthLong = " + l); + System.out.println("testSize = " + testSize); + throw new RuntimeException("Wrong content-length from file"); + } + } finally { + server.terminate(); + } } } diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/net/URLConnection/contentHandler/UserContentHandler.java --- a/jdk/test/java/net/URLConnection/contentHandler/UserContentHandler.java Wed Mar 24 17:32:04 2010 -0700 +++ b/jdk/test/java/net/URLConnection/contentHandler/UserContentHandler.java Thu Mar 25 07:12:43 2010 -0700 @@ -25,8 +25,16 @@ * @bug 4191147 * @summary 1.2beta4 does not load user defined content handlers * @build UserContentHandler - * @run main UserContentHandler + * @run main/othervm UserContentHandler */ + +/* Run in othervm mode since the test sets a system property, java.content.handler.pkgs, + * that prepends a specific package prefix defining a text/plain content + * handler. If other URLConnection tests run before this one they might trigger + * the Sun implementation text/plain content handler in sun.net.www.content + * to be loaded and cached, this will break this test. + */ + import java.net.*; import java.io.*; import java.util.*; @@ -55,7 +63,7 @@ // don't close the connection immediately as otherwise // the http headers may not have been received and the // http client will re-connect. - Thread.currentThread().sleep(2000); + Thread.sleep(2000); s.close(); diff -r dcc229e35a4e -r d6b7fa6e317f jdk/test/java/security/cert/CertificateFactory/ReturnStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/cert/CertificateFactory/ReturnStream.java Thu Mar 25 07:12:43 2010 -0700 @@ -0,0 +1,64 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6813340 + * @summary X509Factory should not depend on is.available()==0 + */ +import java.io.*; +import java.security.cert.*; + +/** + * Tests ol'Mac style file, end witha single '\r' + */ +public class ReturnStream { + + public static void main(String[] args) throws Exception { + FileInputStream fin = new FileInputStream(new File(new File( + System.getProperty("test.src", "."), "openssl"), "pem")); + byte[] buffer = new byte[4096]; + int size = 0; + while (true) { + int len = fin.read(buffer, size, 4096-size); + if (len < 0) break; + size += len; + } + fin.close(); + + // Make a copy + System.arraycopy(buffer, 0, buffer, size, size); + size += size; + + // Create a ol'Mac style file. + for (int i=0; i