Skip to content

Commit 797cc62

Browse files
committed
dtls: Correct error handling for fragment reassembling
1 parent 71d83ec commit 797cc62

1 file changed

Lines changed: 21 additions & 12 deletions

File tree

lib/ssl/src/dtls_handshake.erl

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -318,24 +318,33 @@ address_to_bin({A,B,C,D,E,F,G,H}, Port) ->
318318
<<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16,Port:16>>.
319319

320320
%%--------------------------------------------------------------------
321-
322321
handle_fragments(Version, FragmentData, Buffers0, Options, Acc) ->
323-
Fragments = decode_handshake_fragments(FragmentData),
324-
do_handle_fragments(Version, Fragments, Buffers0, Options, Acc).
322+
try decode_handshake_fragments(FragmentData) of
323+
Fragments ->
324+
do_handle_fragments(Version, Fragments, Buffers0, Options, Acc)
325+
catch
326+
error:_Reason ->
327+
throw(?ALERT_REC(?FATAL, ?DECODE_ERROR, malformed_handshake_fragment))
328+
end.
325329

326330
do_handle_fragments(_, [], Buffers, _Options, Acc) ->
327331
{lists:reverse(Acc), Buffers};
328-
do_handle_fragments(Version, [Fragment | Fragments], Buffers0, #{log_level := LogLevel} = Options, Acc) ->
329-
case reassemble(Version, Fragment, Buffers0) of
330-
{more_data, Buffers} when Fragments == [] ->
331-
{lists:reverse(Acc), Buffers};
332-
{more_data, Buffers} ->
333-
do_handle_fragments(Version, Fragments, Buffers, Options, Acc);
334-
{{Handshake, _} = HsPacket, Buffers} ->
332+
do_handle_fragments(Version, [Fragment | Fragments], Buffers0,
333+
#{log_level := LogLevel} = Options, Acc) ->
334+
try reassemble(Version, Fragment, Buffers0) of
335+
{more_data, Buffers} when Fragments == [] ->
336+
{lists:reverse(Acc), Buffers};
337+
{more_data, Buffers} ->
338+
do_handle_fragments(Version, Fragments, Buffers, Options, Acc);
339+
{{Handshake, _} = HsPacket, Buffers} ->
335340
ssl_logger:debug(LogLevel, inbound, 'handshake', Handshake),
336-
do_handle_fragments(Version, Fragments, Buffers, Options, [HsPacket | Acc])
341+
do_handle_fragments(Version, Fragments, Buffers, Options, [HsPacket | Acc])
342+
catch
343+
error:_Reason ->
344+
throw(?ALERT_REC(?FATAL, ?DECODE_ERROR, malformed_handshake_fragment))
337345
end.
338346

347+
339348
decode_handshake(Version, <<?BYTE(Type), Bin/binary>>) ->
340349
decode_handshake(Version, Type, Bin).
341350

@@ -379,7 +388,7 @@ decode_tls_handshake(Version, Tag, Msg) ->
379388
ssl_handshake:decode_handshake(TLSVersion, Tag, Msg).
380389

381390
decode_handshake_fragments(<<>>) ->
382-
[<<>>];
391+
[];
383392
decode_handshake_fragments(<<?BYTE(Type), ?UINT24(Length),
384393
?UINT16(MessageSeq),
385394
?UINT24(FragmentOffset), ?UINT24(FragmentLength),

0 commit comments

Comments
 (0)