diff --git a/src/share/classes/java/security/ProtectionDomain.java b/src/share/classes/java/security/ProtectionDomain.java index b1778490f5a6dacc18e2250ff5e9999472bf5f7c..5a5ed352e885a0c130f887336af6038d0e25b2be 100644 --- a/src/share/classes/java/security/ProtectionDomain.java +++ b/src/share/classes/java/security/ProtectionDomain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package java.security; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; @@ -456,24 +457,37 @@ public class ProtectionDomain { /** * Used for storing ProtectionDomains as keys in a Map. */ - final class Key {} + final static class Key {} + + // A cache of ProtectionDomains and their Permissions + private static class PDCache implements ProtectionDomainCache { + // We must wrap the PermissionCollection in a WeakReference as there + // are some PermissionCollections which contain strong references + // back to a ProtectionDomain and otherwise would never be removed + // from the WeakHashMap + private final Map> + map = new WeakHashMap<>(); + + @Override + public synchronized void put(ProtectionDomain pd, + PermissionCollection pc) { + map.put(pd == null ? null : pd.key, new WeakReference<>(pc)); + } + + @Override + public synchronized PermissionCollection get(ProtectionDomain pd) { + WeakReference ref = + map.get(pd == null ? null : pd.key); + return ref == null ? null : ref.get(); + } + } static { SharedSecrets.setJavaSecurityProtectionDomainAccess( new JavaSecurityProtectionDomainAccess() { + @Override public ProtectionDomainCache getProtectionDomainCache() { - return new ProtectionDomainCache() { - private final Map map = - Collections.synchronizedMap - (new WeakHashMap()); - public void put(ProtectionDomain pd, - PermissionCollection pc) { - map.put((pd == null ? null : pd.key), pc); - } - public PermissionCollection get(ProtectionDomain pd) { - return pd == null ? map.get(null) : map.get(pd.key); - } - }; + return new PDCache(); } }); } diff --git a/src/share/classes/java/security/cert/X509CertSelector.java b/src/share/classes/java/security/cert/X509CertSelector.java index aae32c93f4445ce15dcac2de3e9afc2e608d662b..4a1ff7ef50d0fc8cbf759f8b7e798d74e2769214 100644 --- a/src/share/classes/java/security/cert/X509CertSelector.java +++ b/src/share/classes/java/security/cert/X509CertSelector.java @@ -2574,8 +2574,10 @@ public class X509CertSelector implements CertSelector { } else { if (maxPathLen < basicConstraints) { if (debug != null) { - debug.println("X509CertSelector.match: maxPathLen too small (" - + maxPathLen + " < " + basicConstraints + ")"); + debug.println("X509CertSelector.match: cert's maxPathLen " + + "is less than the min maxPathLen set by " + + "basicConstraints. " + + "(" + maxPathLen + " < " + basicConstraints + ")"); } return false; } diff --git a/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java b/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java index 0a0be29486490e6e6d53a3e64bee7ec899a36d66..735bab830de72836fefd2174ea8cf25d140e7c46 100644 --- a/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java +++ b/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java @@ -225,7 +225,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream { } public short readShort() throws IOException { - if (read(byteBuf, 0, 2) < 0) { + if (read(byteBuf, 0, 2) != 2) { throw new EOFException(); } @@ -247,7 +247,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream { } public int readInt() throws IOException { - if (read(byteBuf, 0, 4) < 0) { + if (read(byteBuf, 0, 4) != 4) { throw new EOFException(); } diff --git a/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java b/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java index d05d22ff50d8275b577d950b52a5a5e70704cfd2..db36c0e4a44334ac02b40ecf7185c7fa24766d96 100644 --- a/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java +++ b/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -224,7 +224,8 @@ class AdaptableX509CertSelector extends X509CertSelector { if (extVal == null) { if (debug != null) { debug.println("AdaptableX509CertSelector.match: " - + "no subject key ID extension"); + + "no subject key ID extension. Subject: " + + xcert.getSubjectX500Principal()); } return true; } @@ -234,7 +235,9 @@ class AdaptableX509CertSelector extends X509CertSelector { !Arrays.equals(ski, certSubjectKeyID)) { if (debug != null) { debug.println("AdaptableX509CertSelector.match: " - + "subject key IDs don't match"); + + "subject key IDs don't match. " + + "Expected: " + Arrays.toString(ski) + " " + + "Cert's: " + Arrays.toString(certSubjectKeyID)); } return false; } diff --git a/src/share/classes/sun/security/provider/certpath/Builder.java b/src/share/classes/sun/security/provider/certpath/Builder.java index e053b208fccff8a30e259ae11a178980ea5773cd..84cbe66ee093c2b041b8f4548e4b28bf09ada1c0 100644 --- a/src/share/classes/sun/security/provider/certpath/Builder.java +++ b/src/share/classes/sun/security/provider/certpath/Builder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -435,7 +435,12 @@ public abstract class Builder { if (selector.match(targetCert) && !X509CertImpl.isSelfSigned (targetCert, buildParams.sigProvider())) { if (debug != null) { - debug.println("Builder.addMatchingCerts: adding target cert"); + debug.println("Builder.addMatchingCerts: " + + "adding target cert" + + "\n SN: " + Debug.toHexString( + targetCert.getSerialNumber()) + + "\n Subject: " + targetCert.getSubjectX500Principal() + + "\n Issuer: " + targetCert.getIssuerX500Principal()); } return resultCerts.add(targetCert); } diff --git a/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java b/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java index a08c990bc5c49ca71dac09bc6697c54aef4a3bfb..28fb322ddc4d8385089a65730427cf84cc928ddd 100644 --- a/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java +++ b/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -145,8 +145,8 @@ class ConstraintsChecker extends PKIXCertPathChecker { if (prevNC != null && ((i == certPathLength) || !X509CertImpl.isSelfIssued(currCert))) { if (debug != null) { - debug.println("prevNC = " + prevNC); - debug.println("currDN = " + currCert.getSubjectX500Principal()); + debug.println("prevNC = " + prevNC + + ", currDN = " + currCert.getSubjectX500Principal()); } try { @@ -184,8 +184,8 @@ class ConstraintsChecker extends PKIXCertPathChecker { currCertImpl.getNameConstraintsExtension(); if (debug != null) { - debug.println("prevNC = " + prevNC); - debug.println("newNC = " + String.valueOf(newConstraints)); + debug.println("prevNC = " + prevNC + + ", newNC = " + String.valueOf(newConstraints)); } // if there are no previous name constraints, we just return the @@ -225,8 +225,8 @@ class ConstraintsChecker extends PKIXCertPathChecker { String msg = "basic constraints"; if (debug != null) { debug.println("---checking " + msg + "..."); - debug.println("i = " + i); - debug.println("maxPathLength = " + maxPathLength); + debug.println("i = " + i + + ", maxPathLength = " + maxPathLength); } /* check if intermediate cert */ diff --git a/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java b/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java index 7f275fb80e23c550191d77d7e9945cfd7a8303ef..36c412490ba5df997c88102b67949cfe4d0e3346 100644 --- a/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java +++ b/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -320,6 +320,14 @@ public class DistributionPointFetcher { Set trustAnchors, List certStores, Date validity) throws CRLException, IOException { + if (debug != null) { + debug.println("DistributionPointFetcher.verifyCRL: " + + "checking revocation status for" + + "\n SN: " + Debug.toHexString(certImpl.getSerialNumber()) + + "\n Subject: " + certImpl.getSubjectX500Principal() + + "\n Issuer: " + certImpl.getIssuerX500Principal()); + } + boolean indirectCRL = false; X509CRLImpl crlImpl = X509CRLImpl.toImpl(crl); IssuingDistributionPointExtension idpExt = @@ -363,7 +371,9 @@ public class DistributionPointFetcher { } } else if (crlIssuer.equals(certIssuer) == false) { if (debug != null) { - debug.println("crl issuer does not equal cert issuer"); + debug.println("crl issuer does not equal cert issuer.\n" + + "crl issuer: " + crlIssuer + "\n" + + "cert issuer: " + certIssuer); } return false; } else { diff --git a/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java b/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java index 16892c497e2f47a6d80f03f3b49f4c8004f728c8..7f30d3b0ceb7f732e8142485d5e592637b044832 100644 --- a/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java +++ b/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -209,7 +209,8 @@ class ForwardBuilder extends Builder { * getMatchingEECerts */ if (debug != null) { - debug.println("ForwardBuilder.getMatchingCACerts(): ca is target"); + debug.println("ForwardBuilder.getMatchingCACerts(): " + + "the target is a CA"); } if (caTargetSelector == null) { @@ -291,8 +292,14 @@ class ForwardBuilder extends Builder { for (X509Certificate trustedCert : trustedCerts) { if (sel.match(trustedCert)) { if (debug != null) { - debug.println("ForwardBuilder.getMatchingCACerts: " - + "found matching trust anchor"); + debug.println("ForwardBuilder.getMatchingCACerts: " + + "found matching trust anchor." + + "\n SN: " + + Debug.toHexString(trustedCert.getSerialNumber()) + + "\n Subject: " + + trustedCert.getSubjectX500Principal() + + "\n Issuer: " + + trustedCert.getIssuerX500Principal()); } if (caCerts.add(trustedCert) && !searchAllCertStores) { return; diff --git a/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java b/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java index db5eddaf7b7449b7494a891a13cabf64cd4f1f3d..cfffba8329a8e748d620d9e237c414cdba08c63c 100644 --- a/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java +++ b/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import sun.security.util.Debug; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.StringJoiner; import java.security.cert.CertPath; import java.security.cert.CertPathValidatorException; import java.security.cert.PKIXCertPathChecker; @@ -88,20 +89,25 @@ class PKIXMasterCertPathValidator { * current certificate of this loop to be the previous certificate * of the next loop. The state is initialized during first loop. */ - if (debug != null) - debug.println("Checking cert" + (i+1) + " ..."); - X509Certificate currCert = reversedCertList.get(i); + + if (debug != null) { + debug.println("Checking cert" + (i+1) + " - Subject: " + + currCert.getSubjectX500Principal()); + } + Set unresCritExts = currCert.getCriticalExtensionOIDs(); if (unresCritExts == null) { unresCritExts = Collections.emptySet(); } if (debug != null && !unresCritExts.isEmpty()) { - debug.println("Set of critical extensions:"); + StringJoiner joiner = new StringJoiner(", ", "{", "}"); for (String oid : unresCritExts) { - debug.println(oid); + joiner.add(oid); } + debug.println("Set of critical extensions: " + + joiner.toString()); } for (int j = 0; j < certPathCheckers.size(); j++) { diff --git a/src/share/classes/sun/security/provider/certpath/RevocationChecker.java b/src/share/classes/sun/security/provider/certpath/RevocationChecker.java index f38e7dc5005142ce70eaa4d42db61f4723c3e1a8..61d5fd75069bc101296ba3d687710eb5cb559b6d 100644 --- a/src/share/classes/sun/security/provider/certpath/RevocationChecker.java +++ b/src/share/classes/sun/security/provider/certpath/RevocationChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -343,11 +343,17 @@ class RevocationChecker extends PKIXRevocationChecker { PublicKey pubKey, boolean crlSignFlag) throws CertPathValidatorException { + if (debug != null) { + debug.println("RevocationChecker.check: checking cert" + + "\n SN: " + Debug.toHexString(xcert.getSerialNumber()) + + "\n Subject: " + xcert.getSubjectX500Principal() + + "\n Issuer: " + xcert.getIssuerX500Principal()); + } try { if (onlyEE && xcert.getBasicConstraints() != -1) { if (debug != null) { - debug.println("Skipping revocation check, not end " + - "entity cert"); + debug.println("Skipping revocation check; cert is not " + + "an end entity cert"); } return; } diff --git a/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java b/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java index 39507605c0fdfc37cea806927eafd0a6987c0533..3f802e22efb7826a5248ad60a2e9562425d305b6 100644 --- a/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java +++ b/src/share/classes/sun/security/provider/certpath/SunCertPathBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -136,7 +136,8 @@ public final class SunCertPathBuilder extends CertPathBuilderSpi { PKIXCertPathBuilderResult result = buildCertPath(false, adjList); if (result == null) { if (debug != null) { - debug.println("SunCertPathBuilder.engineBuild: 2nd pass"); + debug.println("SunCertPathBuilder.engineBuild: 2nd pass; " + + "try building again searching all certstores"); } // try again adjList.clear(); diff --git a/src/share/classes/sun/security/ssl/ClientHandshaker.java b/src/share/classes/sun/security/ssl/ClientHandshaker.java index 5e253a78227a5f63c5fce35786259ec01aed662c..88fe3fe2379055f3c8a11953c5bd54a2d843edc9 100644 --- a/src/share/classes/sun/security/ssl/ClientHandshaker.java +++ b/src/share/classes/sun/security/ssl/ClientHandshaker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,6 +59,10 @@ import static sun.security.ssl.CipherSuite.KeyExchange.*; */ final class ClientHandshaker extends Handshaker { + // constants for subject alt names of type DNS and IP + private final static int ALTNAME_DNS = 2; + private final static int ALTNAME_IP = 7; + // the server's public key from its certificate. private PublicKey serverKey; @@ -818,6 +822,11 @@ final class ClientHandshaker extends Handshaker { } else { warningSE(Alerts.alert_no_certificate); } + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "Warning: no suitable certificate found - " + + "continuing without client authentication"); + } } // @@ -1497,20 +1506,49 @@ final class ClientHandshaker extends Handshaker { return true; } - // check the iPAddress field in subjectAltName extension - Object thisIPAddress = getSubjectAltName(thisCert, 7); // 7: iPAddress - Object prevIPAddress = getSubjectAltName(prevCert, 7); - if (thisIPAddress != null && prevIPAddress!= null) { - // only allow the exactly match - return Objects.equals(thisIPAddress, prevIPAddress); + // check subject alternative names + Collection> thisSubjectAltNames = null; + try { + thisSubjectAltNames = thisCert.getSubjectAlternativeNames(); + } catch (CertificateParsingException cpe) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "Attempt to obtain subjectAltNames extension failed!"); + } } - // check the dNSName field in subjectAltName extension - Object thisDNSName = getSubjectAltName(thisCert, 2); // 2: dNSName - Object prevDNSName = getSubjectAltName(prevCert, 2); - if (thisDNSName != null && prevDNSName!= null) { - // only allow the exactly match - return Objects.equals(thisDNSName, prevDNSName); + Collection> prevSubjectAltNames = null; + try { + prevSubjectAltNames = prevCert.getSubjectAlternativeNames(); + } catch (CertificateParsingException cpe) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "Attempt to obtain subjectAltNames extension failed!"); + } + } + + if ((thisSubjectAltNames != null) && (prevSubjectAltNames != null)) { + // check the iPAddress field in subjectAltName extension + Collection thisSubAltIPAddrs = + getSubjectAltNames(thisSubjectAltNames, ALTNAME_IP); + Collection prevSubAltIPAddrs = + getSubjectAltNames(prevSubjectAltNames, ALTNAME_IP); + if ((thisSubAltIPAddrs != null) && (prevSubAltIPAddrs != null) && + (isEquivalent(thisSubAltIPAddrs, prevSubAltIPAddrs))) { + + return true; + } + + // check the dNSName field in subjectAltName extension + Collection thisSubAltDnsNames = + getSubjectAltNames(thisSubjectAltNames, ALTNAME_DNS); + Collection prevSubAltDnsNames = + getSubjectAltNames(prevSubjectAltNames, ALTNAME_DNS); + if ((thisSubAltDnsNames != null) && (prevSubAltDnsNames != null) && + (isEquivalent(thisSubAltDnsNames, prevSubAltDnsNames))) { + + return true; + } } // check the certificate subject and issuer @@ -1531,29 +1569,43 @@ final class ClientHandshaker extends Handshaker { /* * Returns the subject alternative name of the specified type in the * subjectAltNames extension of a certificate. + * + * Note that only those subjectAltName types that use String data + * should be passed into this function. */ - private static Object getSubjectAltName(X509Certificate cert, int type) { - Collection> subjectAltNames; - - try { - subjectAltNames = cert.getSubjectAlternativeNames(); - } catch (CertificateParsingException cpe) { - if (debug != null && Debug.isOn("handshake")) { - System.out.println( - "Attempt to obtain subjectAltNames extension failed!"); + private static Collection getSubjectAltNames( + Collection> subjectAltNames, int type) { + + HashSet subAltDnsNames = null; + for (List subjectAltName : subjectAltNames) { + int subjectAltNameType = (Integer)subjectAltName.get(0); + if (subjectAltNameType == type) { + String subAltDnsName = (String)subjectAltName.get(1); + if ((subAltDnsName != null) && !subAltDnsName.isEmpty()) { + if (subAltDnsNames == null) { + subAltDnsNames = + new HashSet<>(subjectAltNames.size()); + } + subAltDnsNames.add(subAltDnsName); + } } - return null; } - if (subjectAltNames != null) { - for (List subjectAltName : subjectAltNames) { - int subjectAltNameType = (Integer)subjectAltName.get(0); - if (subjectAltNameType == type) { - return subjectAltName.get(1); + return subAltDnsNames; + } + + private static boolean isEquivalent(Collection thisSubAltNames, + Collection prevSubAltNames) { + + for (String thisSubAltName : thisSubAltNames) { + for (String prevSubAltName : prevSubAltNames) { + // Only allow the exactly match. Check no wildcard character. + if (thisSubAltName.equalsIgnoreCase(prevSubAltName)) { + return true; } } } - return null; + return false; } } diff --git a/src/share/classes/sun/security/ssl/HandshakeMessage.java b/src/share/classes/sun/security/ssl/HandshakeMessage.java index c621adf1c98da530ae733cc54d567cd5e6d534b8..1aa3ace4d65d98815f07b8953e578be8c8764207 100644 --- a/src/share/classes/sun/security/ssl/HandshakeMessage.java +++ b/src/share/classes/sun/security/ssl/HandshakeMessage.java @@ -492,11 +492,14 @@ class CertificateMsg extends HandshakeMessage void print(PrintStream s) throws IOException { s.println("*** Certificate chain"); - if (debug != null && Debug.isOn("verbose")) { - for (int i = 0; i < chain.length; i++) + if (chain.length == 0) { + s.println(""); + } else if (debug != null && Debug.isOn("verbose")) { + for (int i = 0; i < chain.length; i++) { s.println("chain [" + i + "] = " + chain[i]); - s.println("***"); + } } + s.println("***"); } X509Certificate[] getCertificateChain() { diff --git a/test/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java b/test/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java index 18f7a4c781552ee66f3dfd5f7f0c37579be697d3..be50b4efb2fc915a98a2338164b5f3e2fe09a98c 100644 --- a/test/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java +++ b/test/com/sun/nio/sctp/SctpMultiChannel/SendFailed.java @@ -43,11 +43,16 @@ public class SendFailed { void test(String[] args) throws IOException { SocketAddress address = null; + String os = System.getProperty("os.name").toLowerCase(); if (!Util.isSCTPSupported()) { out.println("SCTP protocol is not supported"); out.println("Test cannot be run"); return; + } else if (os.startsWith("sunos")) { + out.println("Test not supported on Solaris"); + out.println("Test cannot be run"); + return; } System.out.println("remote address: " + remoteAddress); diff --git a/test/javax/imageio/stream/ShortStreamTest.java b/test/javax/imageio/stream/ShortStreamTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2b133a57a7c3510df155a1fa5d05a7c973495566 --- /dev/null +++ b/test/javax/imageio/stream/ShortStreamTest.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8074954 + * @summary Test verifies that an IOException is triggered if input stream + * does not contain enough data to read a multi-byte type. + * + * @run main ShortStreamTest + */ + +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class ShortStreamTest { + public static void main(String[] args) throws IOException { + TestCase[] tests = createTests(); + + for (TestCase t : tests) { + t.test(); + } + } + + private static abstract class TestCase { + abstract void testRead(ImageInputStream iis) throws IOException; + + public void test() { + boolean gotException = false; + + ImageInputStream iis = createShortStream(); + + try { + testRead(iis); + } catch (IOException e) { + e.printStackTrace(System.out); + gotException = true; + } + + if (!gotException) { + throw new RuntimeException("Test failed."); + } + System.out.println("Test PASSED"); + } + } + + + private static ImageInputStream createShortStream() { + try { + byte[] integerTestArray = new byte[] { 80 }; + ByteArrayInputStream bais = new ByteArrayInputStream(integerTestArray); + + return ImageIO.createImageInputStream(bais); + } catch (IOException e) { + return null; + } + } + + private static TestCase[] createTests() { + return new TestCase[]{ + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readInt(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readShort(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readDouble(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readFloat(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readLong(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readUnsignedInt(); + } + }, + new TestCase() { + @Override + void testRead(ImageInputStream iis) throws IOException { + iis.readUnsignedShort(); + } + } + }; + } +}