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
==================
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.

@ -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;

Loading…
Cancel
Save