From 1af3152ddceb71cd604f779ba90fa0ff02194d88 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 18 Aug 2022 14:04:59 +0100 Subject: [PATCH] Fix persisted clients being restored without a session expiry time. --- src/session_expiry.c | 44 ++++++++++++-------- test/broker/06-bridge-reconnect-local-out.py | 1 + 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/session_expiry.c b/src/session_expiry.c index 98913d8a..d5df0535 100644 --- a/src/session_expiry.c +++ b/src/session_expiry.c @@ -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) { struct session_expiry_list *item; @@ -59,21 +79,7 @@ int session_expiry__add(struct mosquitto *context) if(!item) return MOSQ_ERR_NOMEM; item->context = context; - item->context->session_expiry_time = db.now_real_s; - - 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; - } - } + set_session_expiry_time(item->context); context->expiry_list_item = item; 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; item->context = context; - item->context->session_expiry_time = expiry_time; + if(expiry_time){ + item->context->session_expiry_time = expiry_time; + }else{ + set_session_expiry_time(item->context); + + } context->expiry_list_item = item; DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp); @@ -165,4 +176,3 @@ void session_expiry__check(void) } } } - diff --git a/test/broker/06-bridge-reconnect-local-out.py b/test/broker/06-bridge-reconnect-local-out.py index 887470b6..b5adba8f 100755 --- a/test/broker/06-bridge-reconnect-local-out.py +++ b/test/broker/06-bridge-reconnect-local-out.py @@ -17,6 +17,7 @@ def write_config(filename, port1, port2, protocol_version): f.write("address 127.0.0.1:%d\n" % (port1)) f.write("topic bridge/# out\n") f.write("bridge_protocol_version %s\n" % (protocol_version)) + f.write("cleansession false\n") def do_test(proto_ver):