WolfSSLSocket: check if Socket closed before TLS shutdown
parent
f1020fa8fa
commit
518e3b39dd
|
@ -932,6 +932,17 @@ public class WolfSSLSocket extends SSLSocket {
|
||||||
"entered close()");
|
"entered close()");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
/* Check if underlying Socket is still open before closing,
|
||||||
|
* in case application calls SSLSocket.close() multiple times */
|
||||||
|
synchronized (handshakeLock) {
|
||||||
|
if (this.connectionClosed == true || super.isClosed()) {
|
||||||
|
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
|
||||||
|
"Socket already closed, skipping TLS shutdown");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ssl != null) {
|
if (ssl != null) {
|
||||||
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
|
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
|
||||||
"shutting down SSL/TLS connection");
|
"shutting down SSL/TLS connection");
|
||||||
|
|
|
@ -1390,6 +1390,68 @@ public class WolfSSLSocketTest {
|
||||||
System.out.println("\t... passed");
|
System.out.println("\t... passed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleSocketClose() throws Exception {
|
||||||
|
|
||||||
|
String protocol = null;
|
||||||
|
|
||||||
|
System.out.print("\tTesting duplicate close");
|
||||||
|
|
||||||
|
if (WolfSSL.TLSv12Enabled()) {
|
||||||
|
protocol = "TLSv1.2";
|
||||||
|
} else if (WolfSSL.TLSv11Enabled()) {
|
||||||
|
protocol = "TLSv1.1";
|
||||||
|
} else if (WolfSSL.TLSv1Enabled()) {
|
||||||
|
protocol = "TLSv1.0";
|
||||||
|
} else {
|
||||||
|
System.out.println("\t\t... skipped");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create new CTX */
|
||||||
|
this.ctx = tf.createSSLContext(protocol, ctxProvider);
|
||||||
|
|
||||||
|
/* create SSLServerSocket first to get ephemeral port */
|
||||||
|
SSLServerSocket ss = (SSLServerSocket)ctx.getServerSocketFactory()
|
||||||
|
.createServerSocket(0);
|
||||||
|
|
||||||
|
SSLSocket cs = (SSLSocket)ctx.getSocketFactory().createSocket();
|
||||||
|
cs.connect(new InetSocketAddress(ss.getLocalPort()));
|
||||||
|
final SSLSocket server = (SSLSocket)ss.accept();
|
||||||
|
|
||||||
|
ExecutorService es = Executors.newSingleThreadExecutor();
|
||||||
|
Future<Void> serverFuture = es.submit(new Callable<Void>() {
|
||||||
|
@Override
|
||||||
|
public Void call() throws Exception {
|
||||||
|
try {
|
||||||
|
server.startHandshake();
|
||||||
|
|
||||||
|
} catch (SSLException e) {
|
||||||
|
System.out.println("\t\t... failed");
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
cs.startHandshake();
|
||||||
|
|
||||||
|
} catch (SSLHandshakeException e) {
|
||||||
|
System.out.println("\t\t... failed");
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
es.shutdown();
|
||||||
|
serverFuture.get();
|
||||||
|
cs.close();
|
||||||
|
server.close();
|
||||||
|
ss.close();
|
||||||
|
cs.close();
|
||||||
|
|
||||||
|
System.out.println("\t\t... passed");
|
||||||
|
}
|
||||||
|
|
||||||
protected class TestServer extends Thread
|
protected class TestServer extends Thread
|
||||||
{
|
{
|
||||||
private SSLContext ctx;
|
private SSLContext ctx;
|
||||||
|
|
Loading…
Reference in New Issue