diff --git a/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java b/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java index db8aa440ef4..e77a1221cfc 100644 --- a/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java +++ b/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java @@ -816,16 +816,17 @@ private void shutdownInput( // Is it ready to close inbound? // // No need to throw exception if the initial handshake is not started. - if (checkCloseNotify && !conContext.isInputCloseNotified && - (conContext.isNegotiated || conContext.handshakeContext != null)) { - - throw conContext.fatal(Alert.INTERNAL_ERROR, + try { + if (checkCloseNotify && !conContext.isInputCloseNotified && + (conContext.isNegotiated || conContext.handshakeContext != null)) { + throw new SSLException( "closing inbound before receiving peer's close_notify"); - } - - conContext.closeInbound(); - if ((autoClose || !isLayered()) && !super.isInputShutdown()) { - super.shutdownInput(); + } + } finally { + conContext.closeInbound(); + if ((autoClose || !isLayered()) && !super.isInputShutdown()) { + super.shutdownInput(); + } } } diff --git a/test/jdk/sun/security/ssl/SSLSocketImpl/SSLSocketCloseHang.java b/test/jdk/sun/security/ssl/SSLSocketImpl/SSLSocketCloseHang.java index af8e5f9bfa7..f74c1fe7666 100644 --- a/test/jdk/sun/security/ssl/SSLSocketImpl/SSLSocketCloseHang.java +++ b/test/jdk/sun/security/ssl/SSLSocketImpl/SSLSocketCloseHang.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,9 +23,10 @@ /* * @test - * @bug 8184328 + * @bug 8184328 8253368 * @summary JDK8u131-b34-socketRead0 hang at SSL read * @run main/othervm SSLSocketCloseHang + * @run main/othervm SSLSocketCloseHang shutdownInputTest */ import java.io.*; @@ -72,6 +73,8 @@ public class SSLSocketCloseHang { */ static boolean debug = false; + static boolean shutdownInputTest = false; + /* * If the client or server is doing some kind of object creation * that the other side depends on, and that thread prematurely @@ -145,7 +148,26 @@ void doClientSide() throws Exception { Thread.sleep(500); System.err.println("Client closing: " + System.nanoTime()); - sslSocket.close(); + if (shutdownInputTest) { + try { + sslSocket.shutdownInput(); + } catch (SSLException e) { + if (!e.getMessage().contains + ("closing inbound before receiving peer's close_notify")) { + throw new RuntimeException("expected different exception message. " + + e.getMessage()); + } + } + if (!sslSocket.getSession().isValid()) { + throw new RuntimeException("expected session to remain valid"); + } + + } else { + sslSocket.close(); + } + + + clientClosed = true; System.err.println("Client closed: " + System.nanoTime()); } @@ -179,6 +201,8 @@ public static void main(String[] args) throws Exception { if (debug) System.setProperty("javax.net.debug", "all"); + shutdownInputTest = args.length > 0 ? true : false; + /* * Start the tests. */