summaryrefslogtreecommitdiffstats
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
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.
-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;