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 /options/m_config.c | |
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.
Diffstat (limited to 'options/m_config.c')
-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; |