Skip to content
Permalink
Browse files
8253368: TLS connection always receives close_notify exception
Reviewed-by: xuelei
  • Loading branch information
coffeys committed Dec 23, 2020
1 parent 4ea8851 commit a4e082e9857d6acd126fb0734583b4a1e211f9f7
Showing with 37 additions and 12 deletions.
  1. +10 −9 src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java
  2. +27 −3 test/jdk/sun/security/ssl/SSLSocketImpl/SSLSocketCloseHang.java
@@ -820,16 +820,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();
}
}
}

@@ -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 @@
*/
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.
*/

1 comment on commit a4e082e

@openjdk-notifier

This comment has been minimized.

Copy link

@openjdk-notifier openjdk-notifier bot commented on a4e082e Dec 23, 2020

Please sign in to comment.