Skip to content

Commit 2ea072f

Browse files
committed
Fix leaks
Signed-off-by: Peter M <petermm@gmail.com>
1 parent b500de9 commit 2ea072f

File tree

1 file changed

+61
-39
lines changed

1 file changed

+61
-39
lines changed

libs/estdlib/src/socket_dist.erl

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -43,32 +43,46 @@ listen(Name) ->
4343
-spec listen(string(), non_neg_integer()) ->
4444
{ok, {any(), #net_address{}, pos_integer()}} | {error, any()}.
4545
listen(Name, SocketPort) ->
46-
{ok, LSock} = socket:open(inet, stream, tcp),
47-
case
48-
socket:bind(LSock, #{
49-
family => inet,
50-
port => SocketPort,
51-
addr => {0, 0, 0, 0}
52-
})
53-
of
54-
ok ->
55-
ok = socket:listen(LSock),
56-
{ok, #{addr := Addr, port := Port}} = socket:sockname(LSock),
46+
case socket:open(inet, stream, tcp) of
47+
{ok, LSock} ->
48+
try do_listen(Name, LSock, SocketPort) of
49+
{ok, _} = Ok -> Ok;
50+
Error -> socket:close(LSock), Error
51+
catch
52+
Class:Reason:Stack ->
53+
socket:close(LSock),
54+
erlang:raise(Class, Reason, Stack)
55+
end;
56+
{error, _} = Error ->
57+
Error
58+
end.
59+
60+
do_listen(Name, LSock, SocketPort) ->
61+
case socket:bind(LSock, #{family => inet, port => SocketPort, addr => {0, 0, 0, 0}}) of
62+
ok -> do_listen_bound(Name, LSock);
63+
{error, _} = Error -> Error
64+
end.
65+
66+
do_listen_bound(Name, LSock) ->
67+
case socket:listen(LSock) of
68+
ok -> do_listen_listening(Name, LSock);
69+
{error, _} = Error -> Error
70+
end.
71+
72+
do_listen_listening(Name, LSock) ->
73+
case socket:sockname(LSock) of
74+
{ok, #{addr := Addr, port := Port}} ->
5775
ErlEpmd = net_kernel:epmd_module(),
5876
Address = #net_address{
5977
host = Addr,
6078
protocol = tcp,
6179
family = inet
6280
},
6381
case ErlEpmd:register_node(Name, Port) of
64-
{ok, Creation} ->
65-
{ok, {LSock, Address, Creation}};
66-
Error ->
67-
socket:close(LSock),
68-
Error
82+
{ok, Creation} -> {ok, {LSock, Address, Creation}};
83+
{error, _} = Error -> Error
6984
end;
7085
{error, _} = Error ->
71-
socket:close(LSock),
7286
Error
7387
end.
7488

@@ -153,28 +167,36 @@ do_setup(Kernel, Node, Type, MyNode, _LongNames, SetupTime) ->
153167
case ErlEpmd:port_please(Name, Ip) of
154168
{port, TcpPort, Version} ->
155169
dist_util:reset_timer(Timer),
156-
{ok, Sock} = socket:open(inet, stream, tcp),
157-
case
158-
socket:connect(Sock, #{family => inet, addr => Ip, port => TcpPort})
159-
of
160-
ok ->
161-
{ok, DistController} = socket_dist_controller:start(Sock),
162-
true = socket_dist_controller:supervisor(
163-
DistController, self()
164-
),
165-
HSData = hs_data(
166-
Kernel,
167-
MyNode,
168-
DistController,
169-
[],
170-
Node,
171-
Version,
172-
Type,
173-
Timer
174-
),
175-
dist_util:handshake_we_started(HSData);
176-
Other1 ->
177-
?shutdown2(Node, {unexpected, Other1})
170+
case socket:open(inet, stream, tcp) of
171+
{ok, Sock} ->
172+
case
173+
socket:connect(Sock, #{
174+
family => inet, addr => Ip, port => TcpPort
175+
})
176+
of
177+
ok ->
178+
{ok, DistController} =
179+
socket_dist_controller:start(Sock),
180+
true = socket_dist_controller:supervisor(
181+
DistController, self()
182+
),
183+
HSData = hs_data(
184+
Kernel,
185+
MyNode,
186+
DistController,
187+
[],
188+
Node,
189+
Version,
190+
Type,
191+
Timer
192+
),
193+
dist_util:handshake_we_started(HSData);
194+
ConnectError ->
195+
socket:close(Sock),
196+
?shutdown2(Node, {unexpected, ConnectError})
197+
end;
198+
OpenError ->
199+
?shutdown2(Node, {unexpected, OpenError})
178200
end;
179201
Other2 ->
180202
?shutdown2(Node, {unexpected, Other2})

0 commit comments

Comments
 (0)