From b10a60cddb27ac5db7e6dda19099662b45ca7498 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 24 Mar 2021 21:55:20 +0100 Subject: [PATCH] fix(conninfo): Ensure receive_maximum do not exceed limit --- include/emqx_mqtt.hrl | 2 ++ priv/emqx.schema | 4 ++-- src/emqx_channel.erl | 8 ++++++-- src/emqx_session.erl | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/emqx_mqtt.hrl b/include/emqx_mqtt.hrl index 078baf301..c38a167da 100644 --- a/include/emqx_mqtt.hrl +++ b/include/emqx_mqtt.hrl @@ -182,6 +182,8 @@ -define(MAX_PACKET_SIZE, 16#FFFFFFF). -define(MAX_TOPIC_AlIAS, 16#FFFF). +-define(MAX_INFLIGHT_HARD_LIMIT, 32767). + %%-------------------------------------------------------------------- %% MQTT Frame Mask %%-------------------------------------------------------------------- diff --git a/priv/emqx.schema b/priv/emqx.schema index 9b334f83c..131a4dd82 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -936,8 +936,8 @@ end}. %% 0 is equivalent to maximum allowed {mapping, "zone.$name.max_inflight", "emqx.zones", [ {default, 0}, - {datatype, integer} - {validators, ["range:1-32767"]}, + {datatype, integer}, + {validators, ["range:1-32767"]} ]}. %% @doc Retry interval for redelivering QoS1/2 messages. diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 202403399..ef9a83315 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -1142,9 +1142,13 @@ expiry_interval(Zone, #mqtt_packet_connect{clean_start = false}) -> expiry_interval(_Zone, #mqtt_packet_connect{clean_start = true}) -> 0. --compile({inline, [receive_maximum/2]}). receive_maximum(Zone, ConnProps) -> - emqx_mqtt_props:get('Receive-Maximum', ConnProps, emqx_zone:max_inflight(Zone)). + MaxInflightConfig = case emqx_zone:max_inflight(Zone) of + 0 -> ?MAX_INFLIGHT_HARD_LIMIT; + N -> N + end, + MaxByClient = emqx_mqtt_props:get('Receive-Maximum', ConnProps, MaxInflightConfig), + erlang:min(MaxByClient, MaxInflightConfig). %%-------------------------------------------------------------------- %% Run Connect Hooks diff --git a/src/emqx_session.erl b/src/emqx_session.erl index e89943f2a..b920cc294 100644 --- a/src/emqx_session.erl +++ b/src/emqx_session.erl @@ -662,7 +662,7 @@ inc_expired_cnt(message, N) -> -compile({inline, [next_pkt_id/1]}). -next_pkt_id(Session = #session{next_pkt_id = 16#FFFF}) -> +next_pkt_id(Session = #session{next_pkt_id = ?MAX_PACKET_ID}) -> Session#session{next_pkt_id = 1}; next_pkt_id(Session = #session{next_pkt_id = Id}) ->