From: Guus Sliepen Date: Mon, 15 Feb 2021 21:16:04 +0000 (+0100) Subject: Never call timeout_set() outside callbacks if no callback is set. X-Git-Url: http://git.meshlink.io/?p=meshlink;a=commitdiff_plain;h=f00c8df9175fc1aed22f3a889ca039beb78bb98d Never call timeout_set() outside callbacks if no callback is set. We should never try to update a timer if it was never added to the event loop. There were a few places that didn't have an explicit check to prevent this from happening. --- diff --git a/src/meshlink.c b/src/meshlink.c index c34b24c9..00983931 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -3863,7 +3863,7 @@ static void channel_retransmit(struct utcp_connection *utcp_connection) { node_t *n = utcp_connection->utcp->priv; meshlink_handle_t *mesh = n->mesh; - if(n->mtuprobes == 31) { + if(n->mtuprobes == 31 && n->mtutimeout.cb) { timeout_set(&mesh->loop, &n->mtutimeout, &(struct timespec) { 0, 0 }); diff --git a/src/net.c b/src/net.c index ce999cba..22f8287f 100644 --- a/src/net.c +++ b/src/net.c @@ -713,9 +713,11 @@ void retry(meshlink_handle_t *mesh) { } /* Kick the ping timeout handler */ - timeout_set(&mesh->loop, &mesh->pingtimer, &(struct timespec) { - 0, 0 - }); + if(mesh->pingtimer.cb) { + timeout_set(&mesh->loop, &mesh->pingtimer, &(struct timespec) { + 0, 0 + }); + } } /* diff --git a/src/protocol.c b/src/protocol.c index 5da89c7d..9d1dff97 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -228,7 +228,7 @@ bool seen_request(meshlink_handle_t *mesh, const char *request) { new->request = xstrdup(request); new->firstseen = mesh->loop.now.tv_sec; - if(!mesh->past_request_tree->head) { + if(!mesh->past_request_tree->head && mesh->past_request_timeout.cb) { timeout_set(&mesh->loop, &mesh->past_request_timeout, &(struct timespec) { 10, prng(mesh, TIMER_FUDGE) });