fix(frame): variable byte integer could be larger than 4 bytes

This commit is contained in:
Turtle 2021-09-27 22:32:29 +08:00 committed by turtleDeng
parent 094c8fc48b
commit 7cc8cb4f88
2 changed files with 14 additions and 8 deletions

View File

@ -107,7 +107,8 @@
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
{load_module,emqx_misc,brutal_purge,soft_purge,[]}
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}
]},
{<<"4.2.[6-7]">>, [
{load_module, emqx_channel, brutal_purge, soft_purge, []},
@ -118,7 +119,8 @@
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
{load_module,emqx_misc,brutal_purge,soft_purge,[]}
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}
]},
{<<"4.2.6">>, [
{load_module, emqx_channel, brutal_purge, soft_purge, []}
@ -231,7 +233,8 @@
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
{load_module,emqx_misc,brutal_purge,soft_purge,[]}
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}
]},
{<<"4.2.[6-7]">>, [
{load_module, emqx_channel, brutal_purge, soft_purge, []},
@ -242,10 +245,8 @@
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
{load_module,emqx_misc,brutal_purge,soft_purge,[]}
]},
{<<"4.2.6">>, [
{load_module, emqx_channel, brutal_purge, soft_purge, []}
{load_module,emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}
]},
{<<".*">>, []}
]

View File

@ -67,6 +67,8 @@
version => ?MQTT_PROTO_V4
}).
-define(MULTIPLIER_MAX, 16#200000).
-dialyzer({no_match, [serialize_utf8_string/2]}).
%%--------------------------------------------------------------------
@ -142,7 +144,7 @@ parse_remaining_len(<<0:8, Rest/binary>>, Header, 1, 0, Options) ->
parse_remaining_len(<<0:1, 2:7, Rest/binary>>, Header, 1, 0, Options) ->
parse_frame(Rest, Header, 2, Options);
parse_remaining_len(<<1:1, _Len:7, _Rest/binary>>, _Header, Multiplier, _Value, _Options)
when Multiplier > 2097152 ->
when Multiplier > ?MULTIPLIER_MAX ->
error(malformed_variable_byte_integer);
parse_remaining_len(<<1:1, Len:7, Rest/binary>>, Header, Multiplier, Value, Options) ->
parse_remaining_len(Rest, Header, Multiplier * ?HIGHBIT, Value + Len * Multiplier, Options);
@ -411,6 +413,9 @@ parse_property(<<16#2A, Val, Bin/binary>>, Props) ->
parse_variable_byte_integer(Bin) ->
parse_variable_byte_integer(Bin, 1, 0).
parse_variable_byte_integer(<<1:1, _Len:7, _Rest/binary>>, Multiplier, _Value)
when Multiplier > ?MULTIPLIER_MAX ->
error(malformed_variable_byte_integer);
parse_variable_byte_integer(<<1:1, Len:7, Rest/binary>>, Multiplier, Value) ->
parse_variable_byte_integer(Rest, Multiplier * ?HIGHBIT, Value + Len * Multiplier);
parse_variable_byte_integer(<<0:1, Len:7, Rest/binary>>, Multiplier, Value) ->