From a45badc57f366a92321a7adb1b9c1952035484f4 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 4 Dec 2025 11:19:36 +0000 Subject: [PATCH] Add macros to make session expiry values clearer --- include/mosquitto/mqtt_protocol.h | 2 ++ src/bridge.c | 6 +++--- src/conf.c | 4 ++-- src/context.c | 4 ++-- src/handle_connect.c | 16 ++++++++-------- src/persist_write.c | 2 +- src/plugin_persist.c | 2 +- src/plugin_public.c | 6 +++--- src/property_broker.c | 4 +++- src/session_expiry.c | 8 ++++---- src/will_delay.c | 2 +- 11 files changed, 30 insertions(+), 26 deletions(-) diff --git a/include/mosquitto/mqtt_protocol.h b/include/mosquitto/mqtt_protocol.h index 27dac54e..b67b0dfb 100644 --- a/include/mosquitto/mqtt_protocol.h +++ b/include/mosquitto/mqtt_protocol.h @@ -295,4 +295,6 @@ enum mqtt5_sub_options { #define MQTT_SUB_OPT_SET(opt, val) ((opt) |= val) #define MQTT_SUB_OPT_CLEAR(opt, val) ((opt) = (opt) & !val) +#define MQTT_SESSION_EXPIRY_IMMEDIATE 0 +#define MQTT_SESSION_EXPIRY_NEVER UINT32_MAX #endif diff --git a/src/bridge.c b/src/bridge.c index 4c550e94..cb425dde 100644 --- a/src/bridge.c +++ b/src/bridge.c @@ -127,7 +127,7 @@ static struct mosquitto *bridge__new(struct mosquitto__bridge *bridge) new_context->retain_available = bridge->outgoing_retain; new_context->protocol = bridge->protocol_version; if(!bridge->clean_start_local){ - new_context->session_expiry_interval = UINT32_MAX; + new_context->session_expiry_interval = MQTT_SESSION_EXPIRY_NEVER; plugin_persist__handle_client_add(new_context); if(new_context->expiry_list_item){ /* We've restored from persistence and been added to the session @@ -432,7 +432,7 @@ int bridge__connect_step3(struct mosquitto *context) receive_maximum.next = properties; properties = &receive_maximum; } - if(context->bridge->session_expiry_interval != 0){ + if(context->bridge->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ session_expiry_interval.value.i32 = context->bridge->session_expiry_interval; session_expiry_interval.identifier = MQTT_PROP_SESSION_EXPIRY_INTERVAL; session_expiry_interval.property_type = MQTT_PROP_TYPE_INT32; @@ -615,7 +615,7 @@ int bridge__connect(struct mosquitto *context) receive_maximum.next = properties; properties = &receive_maximum; } - if(context->bridge->session_expiry_interval != 0){ + if(context->bridge->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ session_expiry_interval.value.i32 = context->bridge->session_expiry_interval; session_expiry_interval.identifier = MQTT_PROP_SESSION_EXPIRY_INTERVAL; session_expiry_interval.property_type = MQTT_PROP_TYPE_INT32; diff --git a/src/conf.c b/src/conf.c index 7c999d9c..45e2d56f 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1527,8 +1527,8 @@ static int config__read_file_core(struct mosquitto__config *config, bool reload, if(tmp_int < 0){ log__printf(NULL, MOSQ_LOG_ERR, "Error: bridge_session_expiry_interval must not be negative."); return MOSQ_ERR_INVAL; - }else if((uint64_t)tmp_int > (uint64_t)UINT32_MAX){ - log__printf(NULL, MOSQ_LOG_ERR, "Error: bridge_session_expiry_interval must be lower than %u.", UINT32_MAX); + }else if((uint64_t)tmp_int > (uint64_t)MQTT_SESSION_EXPIRY_NEVER){ + log__printf(NULL, MOSQ_LOG_ERR, "Error: bridge_session_expiry_interval must be lower than %u.", MQTT_SESSION_EXPIRY_NEVER); return MOSQ_ERR_INVAL; } cur_bridge->session_expiry_interval = (uint32_t)tmp_int; diff --git a/src/context.c b/src/context.c index 75b12b17..a7f85c49 100644 --- a/src/context.c +++ b/src/context.c @@ -268,7 +268,7 @@ void context__disconnect(struct mosquitto *context, int reason) } } - if(context->session_expiry_interval == 0){ + if(context->session_expiry_interval == MQTT_SESSION_EXPIRY_IMMEDIATE){ plugin__handle_disconnect(context, reason); }else{ plugin__handle_client_offline(context, reason); @@ -281,7 +281,7 @@ void context__disconnect(struct mosquitto *context, int reason) /* Outgoing bridge connection never expire */ #endif { - if(context->session_expiry_interval == 0){ + if(context->session_expiry_interval == MQTT_SESSION_EXPIRY_IMMEDIATE){ plugin_persist__handle_client_delete(context); /* Client session is due to be expired now */ if(context->will_delay_interval == 0){ diff --git a/src/handle_connect.c b/src/handle_connect.c index 140eba9d..22fe0b66 100644 --- a/src/handle_connect.c +++ b/src/handle_connect.c @@ -106,13 +106,13 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 if(context->clean_start == true){ sub__clean_session(found_context); - found_context->session_expiry_interval = 0; + found_context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; plugin_persist__handle_client_delete(found_context); } context->is_persisted = found_context->is_persisted; found_context->is_persisted = false; /* stops persistence for context being removed */ - if(context->clean_start == false && found_context->session_expiry_interval > 0){ + if(context->clean_start == false && found_context->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ if(context->protocol == mosq_p_mqtt311 || context->protocol == mosq_p_mqtt5){ connect_ack |= 0x01; } @@ -170,7 +170,7 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 } } - if((found_context->protocol == mosq_p_mqtt5 && found_context->session_expiry_interval == 0) + if((found_context->protocol == mosq_p_mqtt5 && found_context->session_expiry_interval == MQTT_SESSION_EXPIRY_IMMEDIATE) || (found_context->protocol != mosq_p_mqtt5 && found_context->clean_start == true) || (context->clean_start == true) ){ @@ -183,7 +183,7 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 will__clear(found_context); found_context->clean_start = true; - found_context->session_expiry_interval = 0; + found_context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; mosquitto__set_state(found_context, mosq_cs_duplicate); if(found_context->protocol == mosq_p_mqtt5){ send__disconnect(found_context, MQTT_RC_SESSION_TAKEN_OVER, NULL); @@ -317,7 +317,7 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 if(rc == MOSQ_ERR_SUCCESS){ plugin__handle_connect(context); - if(context->session_expiry_interval != 0){ + if(context->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ plugin_persist__handle_client_add(context); }else if(context->will){ plugin_persist__handle_will_add(context); @@ -582,9 +582,9 @@ static void set_session_expiry_interval(struct mosquitto *context, uint8_t clean /* session_expiry_interval will be overridden if the properties are read later */ if(clean_start == false && protocol_version != PROTOCOL_VERSION_v5){ /* v3* has clean_start == false mean the session never expires */ - context->session_expiry_interval = UINT32_MAX; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_NEVER; }else{ - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; } } @@ -1265,7 +1265,7 @@ handle_connect_error: will__clear(context); /* We return an error here which means the client is freed later on. */ context->clean_start = true; - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; context->will_delay_interval = 0; return rc; } diff --git a/src/persist_write.c b/src/persist_write.c index 2c0f5bc8..07a5edfb 100644 --- a/src/persist_write.c +++ b/src/persist_write.c @@ -172,7 +172,7 @@ static int persist__client_save(FILE *db_fptr) #endif ){ chunk.F.session_expiry_time = context->session_expiry_time; - if(context->session_expiry_interval != 0 && context->session_expiry_interval != UINT32_MAX && context->session_expiry_time == 0){ + if(context->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE && context->session_expiry_interval != MQTT_SESSION_EXPIRY_NEVER && context->session_expiry_time == 0){ chunk.F.session_expiry_time = context->session_expiry_interval + db.now_real_s; }else{ chunk.F.session_expiry_time = context->session_expiry_time; diff --git a/src/plugin_persist.c b/src/plugin_persist.c index e86b1ea2..fa7c0a60 100644 --- a/src/plugin_persist.c +++ b/src/plugin_persist.c @@ -143,7 +143,7 @@ void plugin_persist__handle_client_delete(struct mosquitto *context) plugin_persist__handle_will_delete(context); if(context->is_persisted == false - || context->session_expiry_interval > 0){ + || context->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ return; } diff --git a/src/plugin_public.c b/src/plugin_public.c index 0cc44410..13c13d60 100644 --- a/src/plugin_public.c +++ b/src/plugin_public.c @@ -419,7 +419,7 @@ static void disconnect_client(struct mosquitto *context, bool with_will) if(with_will == false){ mosquitto__set_state(context, mosq_cs_disconnecting); } - if(context->session_expiry_interval > 0){ + if(context->session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ check_subscription_acls(context); } do_disconnect(context, MOSQ_ERR_ADMINISTRATIVE_ACTION); @@ -618,7 +618,7 @@ BROKER_EXPORT int mosquitto_persist_client_delete(const char *clientid) will__clear(context); context->clean_start = true; - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; context->is_persisted = false; mosquitto__set_state(context, mosq_cs_duplicate); do_disconnect(context, MOSQ_ERR_SUCCESS); @@ -876,7 +876,7 @@ BROKER_EXPORT void mosquitto_complete_basic_auth(const char *clientid, int resul send__connack(context, 0, CONNACK_REFUSED_NOT_AUTHORIZED, NULL); } context->clean_start = true; - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; will__clear(context); do_disconnect(context, MOSQ_ERR_AUTH); } diff --git a/src/property_broker.c b/src/property_broker.c index 1043916a..bf3bdbef 100644 --- a/src/property_broker.c +++ b/src/property_broker.c @@ -212,7 +212,9 @@ int property__process_disconnect(struct mosquitto *context, mosquitto_property * while(p){ if(mosquitto_property_identifier(p) == MQTT_PROP_SESSION_EXPIRY_INTERVAL){ uint32_t session_expiry_interval = mosquitto_property_int32_value(p); - if(context->session_expiry_interval == 0 && session_expiry_interval != 0){ + if(context->session_expiry_interval == MQTT_SESSION_EXPIRY_IMMEDIATE + && session_expiry_interval != MQTT_SESSION_EXPIRY_IMMEDIATE){ + return MOSQ_ERR_PROTOCOL; } context->session_expiry_interval = session_expiry_interval; diff --git a/src/session_expiry.c b/src/session_expiry.c index 5dbd5b3c..f25c42bf 100644 --- a/src/session_expiry.c +++ b/src/session_expiry.c @@ -72,7 +72,7 @@ int session_expiry__add(struct mosquitto *context) } if(db.config->persistent_client_expiration == 0){ - if(context->session_expiry_interval == UINT32_MAX){ + if(context->session_expiry_interval == MQTT_SESSION_EXPIRY_NEVER){ /* There isn't a global expiry set, and the client has asked to * never expire, so we don't add it to the list. */ return MOSQ_ERR_SUCCESS; @@ -107,7 +107,7 @@ int session_expiry__add_from_persistence(struct mosquitto *context, time_t expir } if(db.config->persistent_client_expiration == 0){ - if(context->session_expiry_interval == UINT32_MAX){ + if(context->session_expiry_interval == MQTT_SESSION_EXPIRY_NEVER){ /* There isn't a global expiry set, and the client has asked to * never expire, so we don't add it to the list. */ return MOSQ_ERR_SUCCESS; @@ -152,7 +152,7 @@ void session_expiry__remove_all(void) DL_FOREACH_SAFE(expiry_list, item, tmp){ context = item->context; session_expiry__remove(context); - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; context->will_delay_interval = 0; will_delay__remove(context); context__disconnect(context, -1); @@ -193,7 +193,7 @@ void session_expiry__check(void) metrics__int_inc(mosq_counter_clients_expired, 1); /* Session has now expired, so clear interval */ - context->session_expiry_interval = 0; + context->session_expiry_interval = MQTT_SESSION_EXPIRY_IMMEDIATE; /* Session has expired, so will delay should be cleared. */ context->will_delay_interval = 0; will_delay__remove(context); diff --git a/src/will_delay.c b/src/will_delay.c index 980dae26..8ab276de 100644 --- a/src/will_delay.c +++ b/src/will_delay.c @@ -94,7 +94,7 @@ void will_delay__check(void) item->context->will_delay_interval = 0; item->context->will_delay_entry = NULL; context__send_will(item->context); - if(item->context->session_expiry_interval == 0){ + if(item->context->session_expiry_interval == MQTT_SESSION_EXPIRY_IMMEDIATE){ context__add_to_disused(item->context); } mosquitto_FREE(item);