From 52502e29c34592809daf3cc44d28f033796a6e8b Mon Sep 17 00:00:00 2001 From: JianBo He Date: Mon, 20 Dec 2021 14:22:06 +0800 Subject: [PATCH] fix: disconnect the client due to exceed receive-maximum packets As described in the 5.0 specification, we should disconnect clients that exceed the receive-maximum limit. > If it receives more than Receive Maximum QoS 1 and QoS 2 PUBLISH packets where it has not sent a PUBACK or PUBCOMP in response, **the Server uses a DISCONNECT packet with Reason Code 0x9** fix: #6447 --- apps/emqx/src/emqx_channel.erl | 2 +- apps/emqx/test/emqx_channel_SUITE.erl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/emqx/src/emqx_channel.erl b/apps/emqx/src/emqx_channel.erl index eb71aca58..a6cc6b8d7 100644 --- a/apps/emqx/src/emqx_channel.erl +++ b/apps/emqx/src/emqx_channel.erl @@ -637,7 +637,7 @@ do_publish(PacketId, Msg = #message{qos = ?QOS_2}, packet_id => PacketId }), ok = emqx_metrics:inc('packets.publish.dropped'), - handle_out(pubrec, {PacketId, RC}, Channel) + handle_out(disconnect, RC, Channel) end. ensure_quota(_, Channel = #channel{quota = undefined}) -> diff --git a/apps/emqx/test/emqx_channel_SUITE.erl b/apps/emqx/test/emqx_channel_SUITE.erl index 45b00ff29..1077cc870 100644 --- a/apps/emqx/test/emqx_channel_SUITE.erl +++ b/apps/emqx/test/emqx_channel_SUITE.erl @@ -370,7 +370,8 @@ t_handle_in_qos2_publish_with_error_return(_) -> {ok, ?PUBREC_PACKET(2, ?RC_NO_MATCHING_SUBSCRIBERS), Channel1} = emqx_channel:handle_in(Publish2, Channel), Publish3 = ?PUBLISH_PACKET(?QOS_2, <<"topic">>, 3, <<"payload">>), - {ok, ?PUBREC_PACKET(3, ?RC_RECEIVE_MAXIMUM_EXCEEDED), Channel1} = + {ok, [{outgoing, ?DISCONNECT_PACKET(?RC_RECEIVE_MAXIMUM_EXCEEDED)}, + {close, receive_maximum_exceeded}], Channel1} = emqx_channel:handle_in(Publish3, Channel1). t_handle_in_puback_ok(_) ->