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.
pull/2144/head
Roger Light 5 years ago
parent 9faf89be8d
commit a6bb8d3611

@ -1,6 +1,10 @@
2.0.10 - 2021-xx-xx 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: Clients:
- Set `receive-maximum` to not exceed the `-C` message count in mosquitto_sub - Set `receive-maximum` to not exceed the `-C` message count in mosquitto_sub
and mosquitto_rr, to avoid potentially lost messages. Closes #2134. and mosquitto_rr, to avoid potentially lost messages. Closes #2134.

@ -111,6 +111,8 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1
uint8_t connect_ack = 0; uint8_t connect_ack = 0;
int i; int i;
int rc; 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. */ /* 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); 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 if(found_context->msgs_in.inflight || found_context->msgs_in.queued
|| found_context->msgs_out.inflight || found_context->msgs_out.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_in, &found_context->msgs_in, sizeof(struct mosquitto_msg_data));
memcpy(&context->msgs_out, &found_context->msgs_out, 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_in, 0, sizeof(struct mosquitto_msg_data));
memset(&found_context->msgs_out, 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); db__message_reconnect_reset(context);
} }
context->subs = found_context->subs; context->subs = found_context->subs;

Loading…
Cancel
Save