diff --git a/apps/emqx/src/emqx_frame.erl b/apps/emqx/src/emqx_frame.erl index 8620f834f..33b0ccbfa 100644 --- a/apps/emqx/src/emqx_frame.erl +++ b/apps/emqx/src/emqx_frame.erl @@ -472,8 +472,8 @@ parse_packet( ) -> {Properties, <<>>} = parse_properties(Rest, ?MQTT_PROTO_V5, StrictMode), #mqtt_packet_auth{reason_code = ReasonCode, properties = Properties}; -parse_packet(_Header, _FrameBin, _Options) -> - ?PARSE_ERR(malformed_packet). +parse_packet(Header, _FrameBin, _Options) -> + ?PARSE_ERR(#{hit => malformed_packet, header_type => Header#mqtt_packet_header.type}). parse_will_message( Packet = #mqtt_packet_connect{ @@ -512,8 +512,16 @@ parse_properties(<<0, Rest/binary>>, ?MQTT_PROTO_V5, _StrictMode) -> {#{}, Rest}; parse_properties(Bin, ?MQTT_PROTO_V5, StrictMode) -> {Len, Rest} = parse_variable_byte_integer(Bin), - <> = Rest, - {parse_property(PropsBin, #{}, StrictMode), Rest1}. + case Rest of + <> -> + {parse_property(PropsBin, #{}, StrictMode), Rest1}; + _ -> + ?PARSE_ERR(#{ + hint => user_property_not_enough_bytes, + parsed_key_length => Len, + remaining_bytes_length => byte_size(Rest) + }) + end. parse_property(<<>>, Props, _StrictMode) -> Props; diff --git a/apps/emqx/test/emqx_ws_connection_SUITE.erl b/apps/emqx/test/emqx_ws_connection_SUITE.erl index 9860248fe..a6dcdb48d 100644 --- a/apps/emqx/test/emqx_ws_connection_SUITE.erl +++ b/apps/emqx/test/emqx_ws_connection_SUITE.erl @@ -540,8 +540,17 @@ t_parse_incoming_order(_) -> t_parse_incoming_frame_error(_) -> {Packets, _St} = ?ws_conn:parse_incoming(<<3, 2, 1, 0>>, [], st()), - FrameError = {frame_error, malformed_packet}, - [{incoming, FrameError}] = Packets. + + ?assertMatch( + [ + {incoming, + {frame_error, #{ + header_type := _, + hit := malformed_packet + }}} + ], + Packets + ). t_handle_incomming_frame_error(_) -> FrameError = {frame_error, bad_qos}, diff --git a/changes/ce/perf-11532.en.md b/changes/ce/perf-11532.en.md new file mode 100644 index 000000000..d1c8b9266 --- /dev/null +++ b/changes/ce/perf-11532.en.md @@ -0,0 +1 @@ +Improve some error reasons for parsing with invalid packets.