From 983f02ea1bbbbe9fc85b9971e054d2a1e6391342 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Tue, 25 Jun 2024 20:37:54 +0800 Subject: [PATCH] refactor: separate CONNECT flags validation funcs --- apps/emqx/src/emqx_frame.erl | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/emqx/src/emqx_frame.erl b/apps/emqx/src/emqx_frame.erl index 4b4a2d5cf..873311ed4 100644 --- a/apps/emqx/src/emqx_frame.erl +++ b/apps/emqx/src/emqx_frame.erl @@ -284,28 +284,18 @@ parse_connect(FrameBin, StrictMode) -> end, parse_connect2(ProtoName, Rest, StrictMode). -% Note: return malformed if reserved flag is not 0. parse_connect2( ProtoName, <>, StrictMode ) -> - case Reserved of - 0 -> ok; - 1 -> ?PARSE_ERR(reserved_connect_flag) - end, - WillFlag = bool(WillFlagB), - WillRetain = bool(WillRetainB), - case WillFlag of - %% MQTT-v3.1.1-[MQTT-3.1.2-13], MQTT-v5.0-[MQTT-3.1.2-11] - false when WillQoS > 0 -> ?PARSE_ERR(invalid_will_qos); - %% MQTT-v3.1.1-[MQTT-3.1.2-14], MQTT-v5.0-[MQTT-3.1.2-12] - true when WillQoS > 2 -> ?PARSE_ERR(invalid_will_qos); - %% MQTT-v3.1.1-[MQTT-3.1.2-15], MQTT-v5.0-[MQTT-3.1.2-13] - false when WillRetain -> ?PARSE_ERR(invalid_will_retain); - _ -> ok - end, + _ = validate_connect_reserved(Reserved), + _ = validate_connect_will( + WillFlag = bool(WillFlagB), + WillRetain = bool(WillRetainB), + WillQoS + ), {Properties, Rest3} = parse_properties(Rest2, ProtoVer, StrictMode), {ClientId, Rest4} = parse_utf8_string_with_cause(Rest3, StrictMode, invalid_clientid), ConnPacket = #mqtt_packet_connect{ @@ -1133,6 +1123,18 @@ validate_subqos([3 | _]) -> ?PARSE_ERR(bad_subqos); validate_subqos([_ | T]) -> validate_subqos(T); validate_subqos([]) -> ok. +%% MQTT-v3.1.1-[MQTT-3.1.2-3], MQTT-v5.0-[MQTT-3.1.2-3] +validate_connect_reserved(0) -> ok; +validate_connect_reserved(1) -> ?PARSE_ERR(reserved_connect_flag). + +%% MQTT-v3.1.1-[MQTT-3.1.2-13], MQTT-v5.0-[MQTT-3.1.2-11] +validate_connect_will(false, _, WillQos) when WillQos > 0 -> ?PARSE_ERR(invalid_will_qos); +%% MQTT-v3.1.1-[MQTT-3.1.2-14], MQTT-v5.0-[MQTT-3.1.2-12] +validate_connect_will(true, _, WillQoS) when WillQoS > 2 -> ?PARSE_ERR(invalid_will_qos); +%% MQTT-v3.1.1-[MQTT-3.1.2-15], MQTT-v5.0-[MQTT-3.1.2-13] +validate_connect_will(false, WillRetain, _) when WillRetain -> ?PARSE_ERR(invalid_will_retain); +validate_connect_will(_, _, _) -> ok. + bool(0) -> false; bool(1) -> true.