summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2015-09-03 09:43:01 +0200
committerDavid Henningsson <david.henningsson@canonical.com>2015-09-07 14:59:57 +0200
commita527711528ce8f9e1b1f73957fa8281f9126b370 (patch)
treee1366d7e17ca3647ab886187e5fd459e8093328d
parent83de5a0995f0f98217965dab78ffb02eb50fc0e7 (diff)
downloadpulseaudio-a527711528ce8f9e1b1f73957fa8281f9126b370.tar.gz
module: Always remove freed module from modules_pending_unload
pa_module_free is called from more than one place, not all of these places correctly removed the module from the modules_pending_unload array, potentially causing a dangling pointer in that array. Signed-off-by: David Henningsson <david.henningsson@canonical.com>
-rw-r--r--src/pulsecore/module.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c
index 1d4187eeb..2dd64b5c1 100644
--- a/src/pulsecore/module.c
+++ b/src/pulsecore/module.c
@@ -248,6 +248,8 @@ static void pa_module_free(pa_module *m) {
lt_dlclose(m->dl);
+ pa_hashmap_remove(m->core->modules_pending_unload, m);
+
pa_log_info("Unloaded \"%s\" (index: #%u).", m->name, m->index);
pa_subscription_post(m->core, PA_SUBSCRIPTION_EVENT_MODULE|PA_SUBSCRIPTION_EVENT_REMOVE, m->index);
@@ -264,8 +266,6 @@ void pa_module_unload(pa_core *c, pa_module *m, bool force) {
if (m->core->disallow_module_loading && !force)
return;
- pa_hashmap_remove(c->modules_pending_unload, m);
-
if (!(m = pa_idxset_remove_by_data(c->modules, m, NULL)))
return;
@@ -323,6 +323,7 @@ void pa_module_unload_all(pa_core *c) {
c->mainloop->defer_free(c->module_defer_unload_event);
c->module_defer_unload_event = NULL;
}
+ pa_assert(pa_hashmap_isempty(c->modules_pending_unload));
}
static void defer_cb(pa_mainloop_api*api, pa_defer_event *e, void *userdata) {