Fix persisted clients being restored without a session expiry time.

This commit is contained in:
Roger A. Light 2022-08-18 14:04:59 +01:00
parent a8448a9c7b
commit 1af3152ddc
2 changed files with 28 additions and 17 deletions

View File

@ -43,6 +43,26 @@ static int session_expiry__cmp(struct session_expiry_list *i1, struct session_ex
} }
static void set_session_expiry_time(struct mosquitto *context)
{
context->session_expiry_time = db.now_real_s;
if(db.config->persistent_client_expiration == 0){
/* No global expiry, so use the client expiration interval */
context->session_expiry_time += context->session_expiry_interval;
}else{
/* We have a global expiry interval */
if(db.config->persistent_client_expiration < context->session_expiry_interval){
/* The client expiry is longer than the global expiry, so use the global */
context->session_expiry_time += db.config->persistent_client_expiration;
}else{
/* The global expiry is longer than the client expiry, so use the client */
context->session_expiry_time += context->session_expiry_interval;
}
}
}
int session_expiry__add(struct mosquitto *context) int session_expiry__add(struct mosquitto *context)
{ {
struct session_expiry_list *item; struct session_expiry_list *item;
@ -59,21 +79,7 @@ int session_expiry__add(struct mosquitto *context)
if(!item) return MOSQ_ERR_NOMEM; if(!item) return MOSQ_ERR_NOMEM;
item->context = context; item->context = context;
item->context->session_expiry_time = db.now_real_s; set_session_expiry_time(item->context);
if(db.config->persistent_client_expiration == 0){
/* No global expiry, so use the client expiration interval */
item->context->session_expiry_time += item->context->session_expiry_interval;
}else{
/* We have a global expiry interval */
if(db.config->persistent_client_expiration < item->context->session_expiry_interval){
/* The client expiry is longer than the global expiry, so use the global */
item->context->session_expiry_time += db.config->persistent_client_expiration;
}else{
/* The global expiry is longer than the client expiry, so use the client */
item->context->session_expiry_time += item->context->session_expiry_interval;
}
}
context->expiry_list_item = item; context->expiry_list_item = item;
DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp); DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp);
@ -98,7 +104,12 @@ int session_expiry__add_from_persistence(struct mosquitto *context, time_t expir
if(!item) return MOSQ_ERR_NOMEM; if(!item) return MOSQ_ERR_NOMEM;
item->context = context; item->context = context;
if(expiry_time){
item->context->session_expiry_time = expiry_time; item->context->session_expiry_time = expiry_time;
}else{
set_session_expiry_time(item->context);
}
context->expiry_list_item = item; context->expiry_list_item = item;
DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp); DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp);
@ -165,4 +176,3 @@ void session_expiry__check(void)
} }
} }
} }

View File

@ -17,6 +17,7 @@ def write_config(filename, port1, port2, protocol_version):
f.write("address 127.0.0.1:%d\n" % (port1)) f.write("address 127.0.0.1:%d\n" % (port1))
f.write("topic bridge/# out\n") f.write("topic bridge/# out\n")
f.write("bridge_protocol_version %s\n" % (protocol_version)) f.write("bridge_protocol_version %s\n" % (protocol_version))
f.write("cleansession false\n")
def do_test(proto_ver): def do_test(proto_ver):