Просмотр исходного кода

fix: dont log supervisor_report for malformed_utf8_string_length

Shawn 1 год назад
Родитель
Сommit
1c1305eef9

+ 8 - 3
apps/emqx/src/emqx_channel.erl

@@ -1021,7 +1021,7 @@ handle_frame_error(
 ) when
     ?IS_CONNECTED_OR_REAUTHENTICATING(ConnState)
 ->
-    ShutdownCount = shutdown_count(frame_error, Reason),
+    ShutdownCount = shutdown_count(frame_error, Reason, Channel),
     case proto_ver(Reason, ConnInfo) of
         ?MQTT_PROTO_V5 ->
             handle_out(disconnect, {?RC_PACKET_TOO_LARGE, frame_too_large}, Channel);
@@ -1037,7 +1037,7 @@ handle_frame_error(
     is_map(Reason) andalso
         (ConnState == idle orelse ConnState == connecting)
 ->
-    ShutdownCount = shutdown_count(frame_error, Reason),
+    ShutdownCount = shutdown_count(frame_error, Reason, Channel),
     ProtoVer = proto_ver(Reason, ConnInfo),
     NChannel = Channel#channel{conninfo = ConnInfo#{proto_ver => ProtoVer}},
     case ProtoVer of
@@ -1051,7 +1051,7 @@ handle_frame_error(
     Channel = #channel{conn_state = connecting}
 ) ->
     shutdown(
-        shutdown_count(frame_error, Reason),
+        shutdown_count(frame_error, Reason, Channel),
         ?CONNACK_PACKET(?RC_MALFORMED_PACKET),
         Channel
     );
@@ -2728,6 +2728,11 @@ shutdown(success, Reply, Packet, Channel) ->
 shutdown(Reason, Reply, Packet, Channel) ->
     {shutdown, Reason, Reply, Packet, Channel}.
 
+shutdown_count(Kind, Reason, #channel{conninfo = ConnInfo}) ->
+    Keys = [clientid, username, sockname, peername, proto_name, proto_ver],
+    ShutdownCntMeta = maps:with(Keys, ConnInfo),
+    maps:merge(shutdown_count(Kind, Reason), ShutdownCntMeta).
+
 %% process exits with {shutdown, #{shutdown_count := Kind}} will trigger
 %% the connection supervisor (esockd) to keep a shutdown-counter grouped by Kind
 shutdown_count(_Kind, #{cause := Cause} = Reason) when is_atom(Cause) ->

+ 2 - 0
apps/emqx/src/emqx_connection.erl

@@ -781,6 +781,7 @@ parse_incoming(Data, Packets, State = #state{parse_state = ParseState}) ->
     catch
         throw:{?FRAME_PARSE_ERROR, Reason} ->
             ?LOG(info, #{
+                msg => "frame_parse_error",
                 reason => Reason,
                 at_state => emqx_frame:describe_state(ParseState),
                 input_bytes => Data,
@@ -790,6 +791,7 @@ parse_incoming(Data, Packets, State = #state{parse_state = ParseState}) ->
             {[{frame_error, Reason} | Packets], NState};
         error:Reason:Stacktrace ->
             ?LOG(error, #{
+                msg => "frame_parse_failed",
                 at_state => emqx_frame:describe_state(ParseState),
                 input_bytes => Data,
                 parsed_packets => Packets,

+ 3 - 7
apps/emqx/src/emqx_frame.erl

@@ -714,18 +714,14 @@ parse_utf8_string(<<Len:16/big, Str:Len/binary, Rest/binary>>, true) ->
     {validate_utf8(Str), Rest};
 parse_utf8_string(<<Len:16/big, Str:Len/binary, Rest/binary>>, false) ->
     {Str, Rest};
-parse_utf8_string(<<Len:16/big, Rest/binary>>, _) when
-    Len > byte_size(Rest)
-->
+parse_utf8_string(<<Len:16/big, Rest/binary>>, _) when Len > byte_size(Rest) ->
     ?PARSE_ERR(#{
         cause => malformed_utf8_string,
         parsed_length => Len,
         remaining_bytes_length => byte_size(Rest)
     });
-parse_utf8_string(Bin, _) when
-    2 > byte_size(Bin)
-->
-    ?PARSE_ERR(#{reason => malformed_utf8_string_length}).
+parse_utf8_string(Bin, _) when 2 > byte_size(Bin) ->
+    ?PARSE_ERR(#{cause => malformed_utf8_string_length}).
 
 parse_will_payload(<<Len:16/big, Data:Len/binary, Rest/binary>>) ->
     {Data, Rest};

+ 2 - 0
apps/emqx/src/emqx_quic_data_stream.erl

@@ -391,12 +391,14 @@ parse_incoming(Data, PS) ->
     catch
         throw:{?FRAME_PARSE_ERROR, Reason} ->
             ?SLOG(info, #{
+                msg => "frame_parse_error",
                 reason => Reason,
                 input_bytes => Data
             }),
             {[{frame_error, Reason}], PS};
         error:Reason:Stacktrace ->
             ?SLOG(error, #{
+                msg => "frame_parse_failed",
                 input_bytes => Data,
                 reason => Reason,
                 stacktrace => Stacktrace

+ 2 - 0
apps/emqx/src/emqx_ws_connection.erl

@@ -733,6 +733,7 @@ parse_incoming(Data, Packets, State = #state{parse_state = ParseState}) ->
     catch
         throw:{?FRAME_PARSE_ERROR, Reason} ->
             ?LOG(info, #{
+                msg => "frame_parse_error",
                 reason => Reason,
                 at_state => emqx_frame:describe_state(ParseState),
                 input_bytes => Data
@@ -742,6 +743,7 @@ parse_incoming(Data, Packets, State = #state{parse_state = ParseState}) ->
             {[{incoming, FrameError} | Packets], NState};
         error:Reason:Stacktrace ->
             ?LOG(error, #{
+                msg => "frame_parse_failed",
                 at_state => emqx_frame:describe_state(ParseState),
                 input_bytes => Data,
                 exception => Reason,