From 7cd5c16fca6e29f3fccae57a6d118a27c9d589ee Mon Sep 17 00:00:00 2001 From: o9000 Date: Sat, 4 Jul 2015 13:34:09 +0200 Subject: [PATCH] Fix crash when calling stop_timeout from the callback of a repeated timer --- src/util/timer.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/util/timer.c b/src/util/timer.c index be13111..1a6c0e9 100644 --- a/src/util/timer.c +++ b/src/util/timer.c @@ -389,12 +389,19 @@ void callback_multi_timeout(void* arg) struct timespec cur_time; clock_gettime(CLOCK_MONOTONIC, &cur_time); GSList* it = mth->timeout_list; +start: while (it) { timeout* t = it->data; if (++t->multi_timeout->current_count >= t->multi_timeout->count_to_expiration) { t->_callback(t->arg); - t->multi_timeout->current_count = 0; - t->timeout_expires = add_msec_to_timespec(cur_time, t->interval_msec); + if (multi_timeouts && g_hash_table_lookup(multi_timeouts, t)) { + // Timer still exists + t->multi_timeout->current_count = 0; + t->timeout_expires = add_msec_to_timespec(cur_time, t->interval_msec); + } else { + it = mth->timeout_list; + goto start; + } } it = it->next; }