Skip to content

Commit 3134e06

Browse files
Zertbenoitc
authored andcommitted
Fix error with incorrect domain handling in SOCKS5 response (#454)
1 parent 6ef0f9b commit 3134e06

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/hackney_socks5.erl

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ connect(Host, Port, Opts, Timeout) when is_list(Host), is_integer(Port),
4141
ProxyHost = proplists:get_value(socks5_host, Opts),
4242
ProxyPort = proplists:get_value(socks5_port, Opts),
4343
Transport = proplists:get_value(socks5_transport, Opts),
44-
44+
4545
%% filter connection options
4646
AcceptedOpts = [linger, nodelay, send_timeout,
4747
send_timeout_close, raw, inet6],
4848
BaseOpts = [binary, {active, false}, {packet, 0}, {keepalive, true},
4949
{nodelay, true}],
5050
ConnectOpts = hackney_util:filter_options(Opts, AcceptedOpts, BaseOpts),
51-
51+
5252
%% connect to the socks 5 proxy
5353
case gen_tcp:connect(ProxyHost, ProxyPort, ConnectOpts, Timeout) of
5454
{ok, Socket} ->
@@ -186,8 +186,9 @@ do_connection(Socket, Host, Port, Options) ->
186186
case addr(Host, Port, Resolve) of
187187
Addr when is_binary(Addr) ->
188188
ok = gen_tcp:send(Socket, << 5, 1, 0, Addr/binary >>),
189-
case gen_tcp:recv(Socket, 10, ?TIMEOUT) of
190-
{ok, << 5, 0, 0, BoundAddr/binary >>} ->
189+
case gen_tcp:recv(Socket, 4, ?TIMEOUT) of
190+
{ok, << 5, 0, 0, AType>>} ->
191+
BoundAddr = recv_addr_port(AType, gen_tcp, Socket),
191192
check_connection(BoundAddr);
192193
{ok, _} ->
193194
{error, badarg};
@@ -225,6 +226,19 @@ addr(Host, Port, Resolve) ->
225226
end
226227
end.
227228

229+
recv_addr_port(1 = AType, Transport, Socket) -> % IPv4
230+
{ok, Data} = Transport:recv(Socket, 6, ?TIMEOUT),
231+
<<AType, Data>>;
232+
recv_addr_port(4 = AType, Transport, Socket) -> % IPv6
233+
{ok, Data} = Transport:recv(Socket, 18, ?TIMEOUT),
234+
<<AType, Data>>;
235+
recv_addr_port(3 = AType, Transport, Socket) -> % Domain
236+
{ok, <<DLen/integer>>} = Transport:recv(Socket, 1, ?TIMEOUT),
237+
{ok, AddrPort} = Transport:recv(Socket, DLen + 2, ?TIMEOUT),
238+
<<AType, DLen, AddrPort/binary>>;
239+
recv_addr_port(_, _, _) ->
240+
error.
241+
228242
check_connection(<< 3, _DomainLen:8, _Domain/binary >>) ->
229243
ok;
230244
check_connection(<< 1, _Addr:32, _Port:16 >>) ->

0 commit comments

Comments
 (0)