[PATCH v2] firewire: core: fix possible memory leak in build_tree()

From: Abdun Nihaal

Date: Sat Aug 01 2026 - 07:09:32 EST


The memory allocated for node in fw_node_create() is not freed when a
parent port inconsistency error occurs. Fix that by invalidating
references to the node, and then calling fw_node_put() on it.

Fixes: 3038e353cfaf ("firewire: Add core firewire stack.")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Abdun Nihaal <nihaal@xxxxxxxxxxxxxx>
---
Compile tested only. Issue found using static analysis

v1->v2:
- Invalidate references to the node in the child nodes,
as suggested by Takashi Sakamoto.
- Use fw_node_put() instead of kfree() for consistency

v1 link: https://lore.kernel.org/all/20260727095955.104972-1-nihaal@xxxxxxxxxxxxxx/

drivers/firewire/core-topology.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c
index df2ac0dab106..3d0109c3ed90 100644
--- a/drivers/firewire/core-topology.c
+++ b/drivers/firewire/core-topology.c
@@ -227,6 +227,15 @@ static struct fw_node *build_tree(struct fw_card *card, const u32 *sid, int self
(enumerator.quadlet_count > 0 && parent_count != 1)) {
fw_err(card, "parent port inconsistency for node %d: "
"parent_count=%d\n", phy_id, parent_count);
+ while (h != &stack) {
+ child = fw_node(h);
+ for (i = 0; i < child->port_count; i++) {
+ if (child->ports[i] == node)
+ child->ports[i] = NULL;
+ }
+ h = h->next;
+ }
+ fw_node_put(node);
return NULL;
}

--
2.43.0