From 178711f742558ed97ee9015372ac133a260217f3 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 12 Jun 2023 13:05:55 +0800 Subject: [PATCH 1/2] fix: shared-sub with nl sub-option should cause protocol error --- apps/emqx/src/emqx_packet.erl | 7 +++++++ apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl | 15 +++++++++++++++ changes/ce/fix-11074.en.md | 1 + 3 files changed, 23 insertions(+) create mode 100644 changes/ce/fix-11074.en.md diff --git a/apps/emqx/src/emqx_packet.erl b/apps/emqx/src/emqx_packet.erl index 32bd3df53..96eacc5a9 100644 --- a/apps/emqx/src/emqx_packet.erl +++ b/apps/emqx/src/emqx_packet.erl @@ -270,6 +270,9 @@ check(#mqtt_packet_subscribe{topic_filters = TopicFilters}) -> try validate_topic_filters(TopicFilters) catch + %% Known Specificed Reason Code + error:{error, RC} -> + {error, RC}; error:_Error -> {error, ?RC_TOPIC_FILTER_INVALID} end; @@ -413,6 +416,10 @@ run_checks([Check | More], Packet, Options) -> validate_topic_filters(TopicFilters) -> lists:foreach( fun + %% Protocol Error and Should Disconnect + %% MQTT-5.0 [MQTT-3.8.3-4] and [MQTT-4.13.1-1] + ({<>, #{nl := 1}}) -> + error({error, ?RC_PROTOCOL_ERROR}); ({TopicFilter, _SubOpts}) -> emqx_topic:validate(TopicFilter); (TopicFilter) -> diff --git a/apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl b/apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl index fe608f600..a2a2e5244 100644 --- a/apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl +++ b/apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl @@ -985,3 +985,18 @@ t_shared_subscriptions_client_terminates_when_qos_eq_2(Config) -> ?assertEqual(1, counters:get(CRef, 1)), process_flag(trap_exit, false). + +t_share_subscribe_no_local(Config) -> + ConnFun = ?config(conn_fun, Config), + process_flag(trap_exit, true), + ShareTopic = <<"$share/sharename/TopicA">>, + + {ok, Client} = emqtt:start_link([{proto_ver, v5} | Config]), + {ok, _} = emqtt:ConnFun(Client), + %% MQTT-5.0 [MQTT-3.8.3-4] and [MQTT-4.13.1-1] (Disconnect) + case catch emqtt:subscribe(Client, #{}, [{ShareTopic, [{nl, true}, {qos, 1}]}]) of + {'EXIT', {Reason, _Stk}} -> + ?assertEqual({disconnected, ?RC_PROTOCOL_ERROR, #{}}, Reason) + end, + + process_flag(trap_exit, false). diff --git a/changes/ce/fix-11074.en.md b/changes/ce/fix-11074.en.md new file mode 100644 index 000000000..7870e5ade --- /dev/null +++ b/changes/ce/fix-11074.en.md @@ -0,0 +1 @@ +Fix Protocol spec MQTT-5.0 [MQTT-3.8.3-4]. From 4d24fd13a64c84c6b42748ab7b667d4a0930c22b Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Sat, 17 Jun 2023 07:06:42 +0800 Subject: [PATCH 2/2] chore: update changes/ce/fix-11074.en.md Co-authored-by: Thales Macedo Garitezi --- changes/ce/fix-11074.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changes/ce/fix-11074.en.md b/changes/ce/fix-11074.en.md index 7870e5ade..fa557b3a1 100644 --- a/changes/ce/fix-11074.en.md +++ b/changes/ce/fix-11074.en.md @@ -1 +1 @@ -Fix Protocol spec MQTT-5.0 [MQTT-3.8.3-4]. +Fix to adhere to Protocol spec MQTT-5.0 [MQTT-3.8.3-4].