JDK 11+21 SSLSocket.close() deadlock?
Xuelei Fan
xuelei.fan at oracle.com
Tue Jul 10 18:30:38 UTC 2018
Hi Simone,
Thank you for reporting this issue. Now it is tracked in JBS:
https://bugs.openjdk.java.net/browse/JDK-8207004
In the following stacks, only one lock (on 0xac) can be observed. Can I
understand that the read() is blocked, and then the close() is blocked
as well? Did you have a test that we can use to reproduce this issue?
Thanks,
Xuelei
On 7/10/2018 10:19 AM, Simone Bordet wrote:
> Hi,
>
> Please look at the stack traces below.
>
> The server code accept() a SSLSocket, then calls startHandshake() in a
> different thread.
> The client code sends the TLS handshake bytes very slowly.
> The server code waits for a bit for the handshake to finish, then
> attempts to close the socket, but it cannot due to the deadlock below.
> The client stops sending the TLS handshake bytes and now the server is
> stuck forever.
>
> I think invoking close() should wake up the read() with an exception,
> rather than trying to grab the same lock held by the read, as
> asynchronous closes from other threads happen all the times.
>
> The issue does not happen with JDK 9, 10, 11-ea+18, but does happen
> with 11-ea+21.
>
> Thanks!
>
> ---
>
> "main at 1" prio=5 tid=0x1 nid=NA waiting for monitor entry
> java.lang.Thread.State: BLOCKED
> waiting for pool-1-thread-1 at 2224 to release lock on <0xac7> (a
> sun.security.ssl.SSLSocketImpl)
> at sun.security.ssl.SSLSocketImpl.close(SSLSocketImpl.java:447)
>
> "pool-1-thread-1 at 2224" prio=5 tid=0x19 nid=NA runnable
> java.lang.Thread.State: RUNNABLE
> blocks main at 1
> at java.net.SocketInputStream.socketRead0(SocketInputStream.java:-1)
> at java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
> at java.net.SocketInputStream.read(SocketInputStream.java:168)
> at java.net.SocketInputStream.read(SocketInputStream.java:140)
> at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
> at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:167)
> at sun.security.ssl.SSLTransport.decode(SSLTransport.java:108)
> at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:877)
> at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:810)
> - locked <0xac7> (a sun.security.ssl.SSLSocketImpl)
> at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:383)
>
More information about the security-dev
mailing list