diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-04-06 11:53:21 +0200 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-04-06 11:53:21 +0200 |
commit | af2e9169e6900a9228a0be09646dfff989f69f5b (patch) | |
tree | 97976c77aac0727eaf432af2bc2a80523c23a405 /src/tls/tls.erl | |
parent | Avoid quadratic behavior in reading SSL data (diff) |
Don't ignore Length parameter in tls:recv
Diffstat (limited to '')
-rw-r--r-- | src/tls/tls.erl | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/tls/tls.erl b/src/tls/tls.erl index 010d5b52..84a0d473 100644 --- a/src/tls/tls.erl +++ b/src/tls/tls.erl @@ -32,7 +32,7 @@ -export([start/0, start_link/0, tcp_to_tls/2, tls_to_tcp/1, send/2, - recv/2, recv/3, recv_data/2, + recv/2, recv/3, setopts/2, sockname/1, peername/1, controlling_process/2, @@ -160,29 +160,34 @@ tls_to_tcp(#tlssock{tcpsock = TCPSocket, tlsport = Port}) -> recv(Socket, Length) -> recv(Socket, Length, infinity). -recv(#tlssock{tcpsock = TCPSocket} = TLSSock, - _Length, Timeout) -> - %% The Length argument cannot be used for gen_tcp:recv/3, because the - %% compressed size does not equal the desired uncompressed one. - case gen_tcp:recv(TCPSocket, 0, Timeout) of - {ok, Packet} -> - recv_data(TLSSock, Packet); - {error, _Reason} = Error -> - Error +recv(#tlssock{tcpsock = TCPSocket, tlsport = Port} = TLSSock, + Length, Timeout) -> + case port_control(Port, ?GET_DECRYPTED_INPUT, <<Length:32>>) of + <<0>> -> + case gen_tcp:recv(TCPSocket, 0, Timeout) of + {ok, Packet} -> + recv_data(TLSSock, Packet, Length); + {error, _Reason} = Error -> + Error + end; + <<0, In/binary>> -> + {ok, In}; + <<1, Error/binary>> -> + {error, binary_to_list(Error)} end. -recv_data(TLSSock, Packet) -> - case catch recv_data1(TLSSock, Packet) of +recv_data(TLSSock, Packet, Length) -> + case catch recv_data1(TLSSock, Packet, Length) of {'EXIT', Reason} -> {error, Reason}; Res -> Res end. -recv_data1(#tlssock{tcpsock = TCPSocket, tlsport = Port}, Packet) -> +recv_data1(#tlssock{tcpsock = TCPSocket, tlsport = Port}, Packet, Length) -> case port_control(Port, ?SET_ENCRYPTED_INPUT, Packet) of <<0>> -> - case port_control(Port, ?GET_DECRYPTED_INPUT, []) of + case port_control(Port, ?GET_DECRYPTED_INPUT, <<Length:32>>) of <<0, In/binary>> -> case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of <<0, Out/binary>> -> |