On Tue, 22 Aug 2023 18:21:17 GMT, Weibing Xiao <[email protected]> wrote:
>> Please refer to JDK-8314063.
>>
>> The failure scenario is due to the setting of connection timeout. It is
>> either too small or not an optimal value for the system. When the client
>> tries to connect to the server with LDAPs protocol. It requires the
>> handshake after the socket is created and connected, but it fails due to
>> connection timeout and leaves the socket open. It is not closed properly due
>> to the exception handling in the JDK code.
>>
>> The change is adding a try/catch block and closing the socket in the catch
>> block, and the format of the code got changed consequently.
>
> Weibing Xiao has updated the pull request incrementally with one additional
> commit since the last revision:
>
> format the code
Resuggesting restructure to createConnectionSocket methods -- to instantiate
Socket explicitly in one place and to explicitly use connect in all cases
`
```
private Socket createConnectionSocket (String host, int port, int
connectTimeout) throws Exception {
InetSocketAddress endpoint = createInetSocketAddress(host, port);
Socket socket = new Socket();
if (connectTimeout > 0) {
if (debug) {
System.err.println("Connection: creating socket with " +
"a timeout");
}
socket.connect(endpoint, connectTimeout);
} else {
if (debug) {
System.err.println("Connection: creating socket");
}
// connected socket
socket.connect(endpoint);
}
return socket;
}
// create the socket with the provided factory
private Socket createConnectionSocket(String host, int port, String
socketFactory,
int connectTimeout) throws Exception
{
@SuppressWarnings("unchecked")
Class<? extends SocketFactory> socketFactoryClass = (Class<? extends
SocketFactory>)
Obj.helper.loadClass(socketFactory);
Method getDefault =
socketFactoryClass.getMethod("getDefault", new Class<?>[]{});
SocketFactory factory = (SocketFactory) getDefault.invoke(null, new
Object[]{});
InetSocketAddress endpoint =
createInetSocketAddress(host, port);
// create unconnected socket
Socket socket = factory.createSocket();
// create the socket
if (connectTimeout > 0) {
if (debug) {
System.err.println("Connection: creating socket with " +
"a timeout using supplied socket factory");
}
// connected socket
socket.connect(endpoint, connectTimeout);
} else {
if (debug) {
System.err.println("Connection: creating socket using " +
"supplied socket factory");
}
// connected socket
socket.connect(endpoint);
}
return socket;
}
`
-------------
PR Comment: https://git.openjdk.org/jdk/pull/15294#issuecomment-1689007121