From bf68735664acafec3420d81e8486984f1f6f85bd Mon Sep 17 00:00:00 2001 From: firest Date: Wed, 30 Mar 2022 10:42:56 +0800 Subject: [PATCH 1/3] fix(frame): forbidden empty topic in strict mode --- src/emqx_frame.erl | 12 ++++++++++-- test/emqx_frame_SUITE.erl | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/emqx_frame.erl b/src/emqx_frame.erl index 48e8b71fb..aa71b16ae 100644 --- a/src/emqx_frame.erl +++ b/src/emqx_frame.erl @@ -265,7 +265,7 @@ parse_packet(#mqtt_packet_header{type = ?CONNACK}, < - {TopicName, Rest} = parse_utf8_string(Bin, StrictMode), + {TopicName, Rest} = parse_topic_name(Bin, StrictMode), {PacketId, Rest1} = case QoS of ?QOS_0 -> {undefined, Rest}; _ -> parse_packet_id(Rest) @@ -357,7 +357,7 @@ parse_will_message(Packet = #mqtt_packet_connect{will_flag = true, proto_ver = Ver}, Bin, StrictMode) -> {Props, Rest} = parse_properties(Bin, Ver, StrictMode), - {Topic, Rest1} = parse_utf8_string(Rest, StrictMode), + {Topic, Rest1} = parse_topic_name(Rest, StrictMode), {Payload, Rest2} = parse_binary_data(Rest1), {Packet#mqtt_packet_connect{will_props = Props, will_topic = Topic, @@ -524,6 +524,14 @@ parse_binary_data(Bin) when 2 > byte_size(Bin) -> error(malformed_binary_data_length). +parse_topic_name(Bin, false) -> + parse_utf8_string(Bin, false); +parse_topic_name(Bin, true) -> + case parse_utf8_string(Bin, true) of + {<<>>, _Rest} -> error(empty_topic_name); + Result -> Result + end. + %%-------------------------------------------------------------------- %% Serialize MQTT Packet %%-------------------------------------------------------------------- diff --git a/test/emqx_frame_SUITE.erl b/test/emqx_frame_SUITE.erl index d98786e99..81c861bdb 100644 --- a/test/emqx_frame_SUITE.erl +++ b/test/emqx_frame_SUITE.erl @@ -162,6 +162,14 @@ t_parse_malformed_utf8_string(_) -> ParseState = emqx_frame:initial_parse_state(#{strict_mode => true}), ?catch_error(utf8_string_invalid, emqx_frame:parse(MalformedPacket, ParseState)). +t_parse_empty_topic_name(_) -> + Packet = <<48, 4, 0, 0, 0, 1>>, + NormalState = emqx_frame:initial_parse_state(#{strict_mode => false}), + ?assertMatch({_, _}, emqx_frame:parse(Packet, NormalState)), + + StrictState = emqx_frame:initial_parse_state(#{strict_mode => true}), + ?catch_error(empty_topic_name, emqx_frame:parse(Packet, StrictState)). + t_parse_frame_proxy_protocol(_) -> BinList = [ <<"PROXY TCP4 ">>, <<"PROXY TCP6 ">>, <<"PROXY UNKNOWN">> , <<"\r\n\r\n\0\r\nQUIT\n">>], From 22beba8ebdeca73a947304ffd1c9bbfc141fade1 Mon Sep 17 00:00:00 2001 From: firest Date: Wed, 30 Mar 2022 11:12:33 +0800 Subject: [PATCH 2/3] chore: update changes-4.3.md --- CHANGES-4.3.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 501ea34c4..ac7061057 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -17,6 +17,10 @@ File format: * In order to fix the execution order of exhook, e.g. before/after other plugins/modules, ExHook now supports user customizing emqx_hook execute priority. +### Bug fixes + +* Forbidden empty topics in strict mode + ## v4.3.13 ### Important changes From ea8ddcef60f71712164467ec9d8dddcef5f18d9c Mon Sep 17 00:00:00 2001 From: firest Date: Thu, 31 Mar 2022 10:19:10 +0800 Subject: [PATCH 3/3] fix: fix spell error in CHANGES-4.3.md --- CHANGES-4.3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index ac7061057..a27122e59 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -19,7 +19,7 @@ File format: ### Bug fixes -* Forbidden empty topics in strict mode +* Prohibit empty topics in strict mode ## v4.3.13