From c8789180f36e34f930a184bb30ef24875be94b76 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 12 Dec 2019 09:40:37 +0000 Subject: [PATCH] Fix session expiry with very large expiry intervals. Closes #1525. Thanks to Christoph Krey. --- ChangeLog.txt | 3 +++ src/session_expiry.c | 8 +++++++- test/broker/05-session-expiry-v5.py | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 1f01ebe8..512e7bd8 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,6 @@ +Broker: +- Fix session expiry with very large expiry intervals. Closes #1525. + 1.6.8 - 20191128 ================ diff --git a/src/session_expiry.c b/src/session_expiry.c index 59e4c2f6..afbe8f86 100644 --- a/src/session_expiry.c +++ b/src/session_expiry.c @@ -31,7 +31,13 @@ static time_t last_check = 0; static int session_expiry__cmp(struct session_expiry_list *i1, struct session_expiry_list *i2) { - return i1->context->session_expiry_interval - i2->context->session_expiry_interval; + if(i1->context->session_expiry_time == i2->context->session_expiry_time){ + return 0; + }else if(i1->context->session_expiry_time > i2->context->session_expiry_time){ + return 1; + }else{ + return -1; + } } diff --git a/test/broker/05-session-expiry-v5.py b/test/broker/05-session-expiry-v5.py index 96e41ad0..d2aa95dc 100755 --- a/test/broker/05-session-expiry-v5.py +++ b/test/broker/05-session-expiry-v5.py @@ -7,6 +7,14 @@ from mosq_test_helper import * rc = 1 keepalive = 60 + +# This client exists to test possible fixed size int overflow and sorting of the session intervals +# https://github.com/eclipse/mosquitto/issues/1525 +props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 4294967294) +connect0_packet = mosq_test.gen_connect("overflow", keepalive=keepalive, clean_session=False, proto_ver=5, properties=props) +connack0_packet = mosq_test.gen_connack(flags=0, rc=0, proto_ver=5) + + props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 1) connect_packet = mosq_test.gen_connect("clean-qos2-test", keepalive=keepalive, clean_session=False, proto_ver=5, properties=props) connack1_packet = mosq_test.gen_connack(flags=0, rc=0, proto_ver=5) @@ -23,6 +31,12 @@ port = mosq_test.get_port() broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) try: + # Connect client with wildly different session expiry, this should impact + # on the test if all is well + sock0 = mosq_test.do_client_connect(connect0_packet, connack0_packet, port=port, connack_error="connack 0") + # Immediately disconnect, this should now be queued to expire + sock0.close() + # First connect, clean start is false, we expect a normal connack sock = mosq_test.do_client_connect(connect_packet, connack1_packet, port=port, connack_error="connack 1") # Forceful disconnect