From a6bb8d3611fe559dcd79251c9893929ee5966d50 Mon Sep 17 00:00:00 2001 From: Roger Light Date: Sun, 14 Mar 2021 19:26:41 +0000 Subject: [PATCH] Don't over write new receive-maximum if a v5 client connects. This is for when it takes over an old session. Closes #2134. Thanks to Frantisek Fuka. --- ChangeLog.txt | 4 ++++ src/handle_connect.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/ChangeLog.txt b/ChangeLog.txt index e112c086ea..275594ec58 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,6 +1,10 @@ 2.0.10 - 2021-xx-xx ================== +Broker: +- Don't over write new receive-maximum if a v5 client connects and takes over + an old session. Closes #2134. + Clients: - Set `receive-maximum` to not exceed the `-C` message count in mosquitto_sub and mosquitto_rr, to avoid potentially lost messages. Closes #2134. diff --git a/src/handle_connect.c b/src/handle_connect.c index c3355d90eb..b4cefad554 100644 --- a/src/handle_connect.c +++ b/src/handle_connect.c @@ -111,6 +111,8 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 uint8_t connect_ack = 0; int i; int rc; + int in_quota, out_quota; + uint16_t in_maximum, out_maximum; /* Find if this client already has an entry. This must be done *after* any security checks. */ HASH_FIND(hh_id, db.contexts_by_id, context->id, strlen(context->id), found_context); @@ -135,12 +137,22 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 if(found_context->msgs_in.inflight || found_context->msgs_in.queued || found_context->msgs_out.inflight || found_context->msgs_out.queued){ + in_quota = context->msgs_in.inflight_quota; + out_quota = context->msgs_out.inflight_quota; + in_maximum = context->msgs_in.inflight_maximum; + out_maximum = context->msgs_out.inflight_maximum; + memcpy(&context->msgs_in, &found_context->msgs_in, sizeof(struct mosquitto_msg_data)); memcpy(&context->msgs_out, &found_context->msgs_out, sizeof(struct mosquitto_msg_data)); memset(&found_context->msgs_in, 0, sizeof(struct mosquitto_msg_data)); memset(&found_context->msgs_out, 0, sizeof(struct mosquitto_msg_data)); + context->msgs_in.inflight_quota = in_quota; + context->msgs_out.inflight_quota = out_quota; + context->msgs_in.inflight_maximum = in_maximum; + context->msgs_out.inflight_maximum = out_maximum; + db__message_reconnect_reset(context); } context->subs = found_context->subs;