diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 37a2107db..7cfbd60d5 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -217,6 +217,9 @@ handle_in(?CONNECT_PACKET(ConnPkt), Channel) -> handle_out(connack, {ReasonCode, ConnPkt}, NChannel) end; +handle_in(?PACKET(_), Channel = #channel{conn_state = ConnState}) when ConnState =/= connected -> + handle_out(disconnect, ?RC_PROTOCOL_ERROR, Channel); + handle_in(Packet = ?PUBLISH_PACKET(_QoS), Channel) -> case emqx_packet:check(Packet) of ok -> process_publish(Packet, Channel); diff --git a/test/emqx_channel_SUITE.erl b/test/emqx_channel_SUITE.erl index b52d9ed07..412bafe80 100644 --- a/test/emqx_channel_SUITE.erl +++ b/test/emqx_channel_SUITE.erl @@ -112,6 +112,12 @@ t_handle_in_unexpected_connect_packet(_) -> {ok, [{outgoing, Packet}, {close, protocol_error}], Channel} = emqx_channel:handle_in(?CONNECT_PACKET(connpkt()), Channel). +t_handle_in_unexpected_packet(_) -> + Channel = channel(), + Packet = ?DISCONNECT_PACKET(?RC_PROTOCOL_ERROR), + {ok, [{outgoing, Packet}, {close, protocol_error}], Channel} = + emqx_channel:handle_in(?PUBLISH_PACKET(?QOS_0), Channel). + t_handle_in_qos0_publish(_) -> ok = meck:expect(emqx_broker, publish, fun(_) -> [] end), Channel = channel(#{conn_state => connected}),