JDK-8208657 : Endless loop in SSLSocketImpl.waitForClose for MSSQL JDBC driver
  • Type: Bug
  • Component: security-libs
  • Sub-Component: javax.net.ssl
  • Affected Version: 11
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_10
  • CPU: x86_64
  • Submitted: 2018-08-01
  • Updated: 2018-09-12
  • Resolved: 2018-08-02
Related Reports
Duplicate :  
Description
ADDITIONAL SYSTEM INFORMATION :
Microsoft Windows [Version 10.0.10586]
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11-ea+24)
OpenJDK 64-Bit Server VM 18.9 (build 11-ea+24, mixed mode)

A DESCRIPTION OF THE PROBLEM :
JDBC connection cannot be obtained by MSSQL JDBC driver 6.4 in Java 11-ea24. DriverManager.getConnection hangs because of an endless loop in SSLSocketImpl.waitForClose.
In Java 10.0.2, a connection can be established.

REGRESSION : Last worked in version 10.0.2

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the sample.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A JDBC connection.
ACTUAL -
No result. Program hangs in 

sun.security.ssl.SSLSocketImpl.class:
    private void waitForClose() throws IOException {
...
        while (!conContext.isInboundDone()) { // endless
        }

jstack.exe shows:

"main" #1 prio=5 os_prio=0 cpu=73328.13ms elapsed=75.83s tid=0x0000015602def000 nid=0x214c runnable  [0x000000425f0fe000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.Throwable.fillInStackTrace(java.base@11-ea/Native Method)
	at java.lang.Throwable.fillInStackTrace(java.base@11-ea/Throwable.java:787)
	- locked <0x0000000767a73f80> (a java.io.EOFException)
	at java.lang.Throwable.<init>(java.base@11-ea/Throwable.java:270)
	at java.lang.Exception.<init>(java.base@11-ea/Exception.java:66)
	at java.io.IOException.<init>(java.base@11-ea/IOException.java:58)
	at java.io.EOFException.<init>(java.base@11-ea/EOFException.java:62)
	at sun.security.ssl.SSLSocketInputRecord.decode(java.base@11-ea/SSLSocketInputRecord.java:169)
	at sun.security.ssl.SSLTransport.decode(java.base@11-ea/SSLTransport.java:108)
	at sun.security.ssl.SSLSocketImpl.decode(java.base@11-ea/SSLSocketImpl.java:877)
	at sun.security.ssl.SSLSocketImpl.waitForClose(java.base@11-ea/SSLSocketImpl.java:952)
	at sun.security.ssl.SSLSocketImpl.closeSocket(java.base@11-ea/SSLSocketImpl.java:929)
	at sun.security.ssl.SSLSocketImpl.shutdown(java.base@11-ea/SSLSocketImpl.java:1170)
	at sun.security.ssl.TransportContext.initiateOutboundClose(java.base@11-ea/TransportContext.java:567)
	at sun.security.ssl.TransportContext.closeOutbound(java.base@11-ea/TransportContext.java:482)
	at sun.security.ssl.TransportContext.close(java.base@11-ea/TransportContext.java:450)
	at sun.security.ssl.SSLSocketImpl.close(java.base@11-ea/SSLSocketImpl.java:447)
	- locked <0x0000000760000b70> (a sun.security.ssl.SSLSocketImpl)
	at com.microsoft.sqlserver.jdbc.TDSChannel.disableSSL(IOBuffer.java:711)
	at com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:4093)
	at com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:3196)
	at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:7712)
	at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:7700)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4547)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3409)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:85)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3373)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7344)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2713)
	- locked <0x0000000760006228> (a java.lang.Object)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2261)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1921)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1762)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1077)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:623)
	at java.sql.DriverManager.getConnection(java.sql@11-ea/DriverManager.java:677)
	at java.sql.DriverManager.getConnection(java.sql@11-ea/DriverManager.java:189)
	at SSLCloseHangsInJDBCDriver.main(SSLCloseHangsInJDBCDriver.java:18) 


---------- BEGIN SOURCE ----------
------ Java source ------
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class SSLCloseHangsInJDBCDriver {
	
	public static void main(String[] args) throws Exception {
		System.out.println("PID=" + ProcessHandle.current().pid());
		
	    Properties props = new Properties();
	    props.put("user", "sa");
	    props.put("password", "sa123456");
	    props.put("socketTimeout", "10");
	    
	    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	    
	    Connection cnn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433", props);
	    System.out.println("cnn=" + cnn);
	    cnn.close();
	    System.out.println("OK");
	}

}

--- BAT for compile and test ---
@echo off
set JAVA_HOME="c:\Program Files\OpenJDK\jdk-11"
REM set JAVA_HOME="c:\Program Files\OpenJDK\jdk-10.0.2"
set JAVAC=%JAVA_HOME%\bin\javac
set JAVA=%JAVA_HOME%\bin\java
set CLASSPATH=.\bin;.\lib\mssql-jdbc-6.4.0.jre9.jar

REM compile 
DEL /Q .\bin\*.*
%JAVAC% -d .\bin .\src\SSLCloseHangsInJDBCDriver.java

REM execute
VER
%JAVA% -version
%JAVA% SSLCloseHangsInJDBCDriver

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
No Workaround.

FREQUENCY : always