fix(ft): make `fin` packet parser stricter + safer
This commit is contained in:
parent
58115715dd
commit
2cf2a2d952
|
@ -146,11 +146,14 @@ on_file_command(PacketId, Msg, FileCommand) ->
|
||||||
case string:split(FileCommand, <<"/">>, all) of
|
case string:split(FileCommand, <<"/">>, all) of
|
||||||
[FileId, <<"init">>] ->
|
[FileId, <<"init">>] ->
|
||||||
on_init(PacketId, Msg, transfer(Msg, FileId));
|
on_init(PacketId, Msg, transfer(Msg, FileId));
|
||||||
[FileId, <<"fin">>, FinalSizeBin | ChecksumL] ->
|
[FileId, <<"fin">>, FinalSizeBin | MaybeChecksum] when length(MaybeChecksum) =< 1 ->
|
||||||
validate([{size, FinalSizeBin}], fun([FinalSize]) ->
|
ChecksumBin = emqx_maybe:from_list(MaybeChecksum),
|
||||||
Checksum = emqx_maybe:from_list(ChecksumL),
|
validate(
|
||||||
|
[{size, FinalSizeBin}, {{maybe, checksum}, ChecksumBin}],
|
||||||
|
fun([FinalSize, Checksum]) ->
|
||||||
on_fin(PacketId, Msg, transfer(Msg, FileId), FinalSize, Checksum)
|
on_fin(PacketId, Msg, transfer(Msg, FileId), FinalSize, Checksum)
|
||||||
end);
|
end
|
||||||
|
);
|
||||||
[FileId, <<"abort">>] ->
|
[FileId, <<"abort">>] ->
|
||||||
on_abort(Msg, transfer(Msg, FileId));
|
on_abort(Msg, transfer(Msg, FileId));
|
||||||
[FileId, OffsetBin] ->
|
[FileId, OffsetBin] ->
|
||||||
|
@ -375,7 +378,11 @@ do_validate([{checksum, Checksum} | Rest], Parsed) ->
|
||||||
do_validate(Rest, [Bin | Parsed]);
|
do_validate(Rest, [Bin | Parsed]);
|
||||||
{error, _Reason} ->
|
{error, _Reason} ->
|
||||||
{error, {invalid_checksum, Checksum}}
|
{error, {invalid_checksum, Checksum}}
|
||||||
end.
|
end;
|
||||||
|
do_validate([{{maybe, _}, undefined} | Rest], Parsed) ->
|
||||||
|
do_validate(Rest, [undefined | Parsed]);
|
||||||
|
do_validate([{{maybe, T}, Value} | Rest], Parsed) ->
|
||||||
|
do_validate([{T, Value} | Rest], Parsed).
|
||||||
|
|
||||||
parse_checksum(Checksum) when is_binary(Checksum) andalso byte_size(Checksum) =:= 64 ->
|
parse_checksum(Checksum) when is_binary(Checksum) andalso byte_size(Checksum) =:= 64 ->
|
||||||
try
|
try
|
||||||
|
|
Loading…
Reference in New Issue