Skip to content

Commit

Permalink
Don't over write new receive-maximum if a v5 client connects.
Browse files Browse the repository at this point in the history
This is for when it takes over an old session.

Closes #2134. Thanks to Frantisek Fuka.
  • Loading branch information
ralight committed Mar 14, 2021
1 parent 9faf89b commit a6bb8d3
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
4 changes: 4 additions & 0 deletions 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.
Expand Down
12 changes: 12 additions & 0 deletions src/handle_connect.c
Expand Up @@ -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);
Expand All @@ -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;
Expand Down

0 comments on commit a6bb8d3

Please sign in to comment.