[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