8253368: TLS connection always receives close_notify exception
Reviewed-by: xuelei
This commit is contained in:
parent
4ea88512dd
commit
a4e082e985
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user