From a4e082e9857d6acd126fb0734583b4a1e211f9f7 Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Wed, 23 Dec 2020 12:26:44 +0000 Subject: [PATCH] 8253368: TLS connection always receives close_notify exception Reviewed-by: xuelei --- .../sun/security/ssl/SSLSocketImpl.java | 19 ++++++------ .../ssl/SSLSocketImpl/SSLSocketCloseHang.java | 30 +++++++++++++++++-- 2 files changed, 37 insertions(+), 12 deletions(-) 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 439be80a1e6..8b28a49eba6 100644 --- a/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java +++ b/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java @@ -820,16 +820,17 @@ public final class SSLSocketImpl // 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 @@ public class SSLSocketCloseHang { 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 class SSLSocketCloseHang { if (debug) System.setProperty("javax.net.debug", "all"); + shutdownInputTest = args.length > 0 ? true : false; + /* * Start the tests. */