diff options
author | wm4 <wm4@nowhere> | 2019-06-30 20:04:08 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-09-19 20:37:05 +0200 |
commit | c942178c92321a99ddf079e55af85724fc74ee16 (patch) | |
tree | 2a51e0d6ee53f5d3d70e4ebbac9c0931a22adc0c | |
parent | 8a48a277edbe4002460899bcca28896eea3feeca (diff) | |
download | mpv-c942178c92321a99ddf079e55af85724fc74ee16.tar.bz2 mpv-c942178c92321a99ddf079e55af85724fc74ee16.tar.xz |
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.
-rw-r--r-- | options/m_config.c | 7 |
1 files changed, 6 insertions, 1 deletions
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; |