diff options
author | Lizhi Hou <[email protected]> | 2023-09-29 10:10:17 -0700 |
---|---|---|
committer | Bjorn Helgaas <[email protected]> | 2023-09-29 17:33:51 -0500 |
commit | f69977404700a3d33b1c4b492c2a44f17cb07af5 (patch) | |
tree | 4fbb9ea726173d56c97563b0aeffe0d5e44abffd | |
parent | 33efa29e825636a06d5711c9dfccf92726d2fc81 (diff) |
PCI: of: Destroy changeset when adding PCI device node fails
Previously of_pci_make_dev_node() leaked a cset if it failed to create a
device node for the PCI device with of_changeset_create_node().
Destroy the cset if of_changeset_create_node() fails.
Fixes: 407d1a51921e ("PCI: Create device tree node for bridge")
Link: https://lore.kernel.org/r/[email protected]
Reported-by: Herve Codina <[email protected]>
Closes: https://lore.kernel.org/all/[email protected]/
Signed-off-by: Lizhi Hou <[email protected]>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Herve Codina <[email protected]>
-rw-r--r-- | drivers/pci/of.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/pci/of.c b/drivers/pci/of.c index 2af64bcb7da3..51e3dd0ea5ab 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -657,30 +657,33 @@ void of_pci_make_dev_node(struct pci_dev *pdev) cset = kmalloc(sizeof(*cset), GFP_KERNEL); if (!cset) - goto failed; + goto out_free_name; of_changeset_init(cset); np = of_changeset_create_node(cset, ppnode, name); if (!np) - goto failed; - np->data = cset; + goto out_destroy_cset; ret = of_pci_add_properties(pdev, cset, np); if (ret) - goto failed; + goto out_free_node; ret = of_changeset_apply(cset); if (ret) - goto failed; + goto out_free_node; + np->data = cset; pdev->dev.of_node = np; kfree(name); return; -failed: - if (np) - of_node_put(np); +out_free_node: + of_node_put(np); +out_destroy_cset: + of_changeset_destroy(cset); + kfree(cset); +out_free_name: kfree(name); } #endif |