[pulseaudio-discuss] [PATCH 04/15] node: Fix unsafe pa_idxset_remove_by_index() call

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Thu Feb 13 19:35:49 CET 2014


If pa_node_unlink() was called before the node was added to
pa_core.nodes, then the pa_idxset_remove_by_index() call would remove
some innocent bystander, or it would fail, leading to an assertion
failure.
---
 src/pulsecore/node.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/pulsecore/node.c b/src/pulsecore/node.c
index 3ef35e3..c0408c2 100644
--- a/src/pulsecore/node.c
+++ b/src/pulsecore/node.c
@@ -131,6 +131,7 @@ pa_node *pa_node_new(pa_core *core, pa_node_new_data *data) {
 
     n = pa_xnew0(pa_node, 1);
     n->core = core;
+    n->index = PA_INVALID_INDEX;
 
     if (!(registered_name = pa_namereg_register(core, name, PA_NAMEREG_NODE, n, false))) {
         pa_log("Failed to register name %s.", name);
@@ -417,7 +418,10 @@ void pa_node_unlink(pa_node *node) {
     if (node->monitor_of)
         node->monitor_of->monitor = NULL;
 
-    pa_assert_se(pa_idxset_remove_by_index(node->core->nodes, node->index));
+    if (node->index != PA_INVALID_INDEX) {
+        pa_assert_se(pa_idxset_remove_by_index(node->core->nodes, node->index));
+        node->index = PA_INVALID_INDEX;
+    }
 
 }
 
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list