From c942178c92321a99ddf079e55af85724fc74ee16 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 30 Jun 2019 20:04:08 +0200 Subject: m_config: add an assert for a theoretical issue Or at least I hope it's theoretical. This function is supposed to unset any old listeners for the given cache, and the code works only if there's at most 1. Add a defense break to avoid UB if there's more than one, and add an assert() to check the assumption that there's at most one. The added comment is unrelated. --- options/m_config.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'options') diff --git a/options/m_config.c b/options/m_config.c index f808b1c1c7..6e389b1d76 100644 --- a/options/m_config.c +++ b/options/m_config.c @@ -1407,9 +1407,14 @@ void m_config_cache_set_wakeup_cb(struct m_config_cache *cache, pthread_mutex_lock(&shadow->lock); if (cache->in_list) { for (int n = 0; n < shadow->num_listeners; n++) { - if (shadow->listeners[n] == cache) + if (shadow->listeners[n] == cache) { MP_TARRAY_REMOVE_AT(shadow->listeners, shadow->num_listeners, n); + break; + } } + for (int n = 0; n < shadow->num_listeners; n++) + assert(shadow->listeners[n] != cache); // only 1 wakeup_cb per cache + // (The deinitialization path relies on this to free all memory.) if (!shadow->num_listeners) { talloc_free(shadow->listeners); shadow->listeners = NULL; -- cgit v1.2.3