Skip to content

Commit 5269deb

Browse files
authored
fix: close TCP socket on SSL connection failure (#125)
* fix: close TCP socket on SSL connection failure Prevents socket leak when ssl:connect/3 fails by closing the underlying TCP socket before returning the error. * test: verify TCP socket cleanup on SSL connection failure
1 parent 9eef59c commit 5269deb

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

src/pgo_handler.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ setup_ssl(Conn=#conn{socket=Socket}, Options) ->
157157
{ok, SSLSocket} ->
158158
setup_startup(Conn#conn{socket=SSLSocket}, Options);
159159
{error, _} = SSLConnectErr ->
160+
gen_tcp:close(Socket),
160161
SSLConnectErr
161162
end;
162163
{ok, <<$N>>} ->

test/pgo_basic_SUITE.erl

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ all() ->
1515

1616
groups() ->
1717
[{clear, [], cases()},
18-
{ssl, [], [int4_range, exceptions]},
18+
{ssl, [], [int4_range, exceptions, ssl_connect_failure_closes_socket]},
1919
{domain_socket, [], [int4_range]}].
2020

2121
cases() ->
@@ -198,6 +198,26 @@ exceptions(_Config) ->
198198

199199
ok.
200200

201+
ssl_connect_failure_closes_socket(_Config) ->
202+
%% Connect with invalid SSL options to force ssl:connect/3 to fail
203+
%% after the server accepts the SSL request. Verify the TCP socket
204+
%% is properly closed and not leaked.
205+
TcpPortsBefore = [P || P <- erlang:ports(),
206+
erlang:port_info(P, name) =:= {name, "tcp_inet"}],
207+
{error, _} = pgo_handler:open(default,
208+
#{host => "127.0.0.1",
209+
port => 5434,
210+
user => "test",
211+
password => "password",
212+
database => "test",
213+
ssl => true,
214+
ssl_options => [{cacertfile, "/nonexistent/ca.pem"},
215+
{verify, verify_peer}]}),
216+
TcpPortsAfter = [P || P <- erlang:ports(),
217+
erlang:port_info(P, name) =:= {name, "tcp_inet"}],
218+
?assertEqual(length(TcpPortsBefore), length(TcpPortsAfter)),
219+
ok.
220+
201221
select(_Config) ->
202222
{error, {Module, Reason}} = pgo:query("select $1", []),
203223
?assertEqual("parameters needed for query not equal to number of arguments 1 != 0", Module:format_error(Reason)),

0 commit comments

Comments
 (0)