summaryrefslogtreecommitdiffstats
path: root/options
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-06-30 20:04:08 +0200
committerwm4 <wm4@nowhere>2019-09-19 20:37:05 +0200
commitc942178c92321a99ddf079e55af85724fc74ee16 (patch)
tree2a51e0d6ee53f5d3d70e4ebbac9c0931a22adc0c /options
parent8a48a277edbe4002460899bcca28896eea3feeca (diff)
downloadmpv-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')
-rw-r--r--options/m_config.c7
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;