From: sashiko-bot@kernel.org
To: "Rosen Penev" <rosenp@gmail.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup
Date: Wed, 22 Jul 2026 23:24:44 +0000 [thread overview]
Message-ID: <20260722232445.4CC101F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260722231214.857760-1-rosenp@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Missing teardown for partially initialized ports in `apple_pcie_init()` leaves dangling chained IRQ handlers and leaked IRQ domains, leading to a Use-After-Free on probe error.
- [High] MSI parent IRQ domain is leaked on probe failure, leading to Use-After-Free on re-probe.
--
--- Patch [1]: [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup ---
commit eab8bdc8d6046daad9b1ca1595a1c3a4a1b10540
Author: Rosen Penev <rosenp@gmail.com>
PCI: apple: use fwnode_irq_get() for port IRQ lookup
Replace irq_of_parse_and_map() with fwnode_irq_get() on the PCIe
controller device's fwnode. Propagate the error instead of checking
for zero, allowing negative errors like -EPROBE_DEFER to be handled.
> diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c
> index c2cffc0659f44..535acf274b786 100644
> --- a/drivers/pci/controller/pcie-apple.c
> +++ b/drivers/pci/controller/pcie-apple.c
> @@ -400,14 +400,13 @@ static int apple_pcie_port_setup_irq(struct apple_pcie_port *port)
> {
> struct fwnode_handle *fwnode = &port->np->fwnode;
> struct apple_pcie *pcie = port->pcie;
> - unsigned int irq;
> + int irq;
> u32 val = 0;
>
> /* FIXME: consider moving each interrupt under each port */
> - irq = irq_of_parse_and_map(to_of_node(dev_fwnode(port->pcie->dev)),
> - port->idx);
> - if (!irq)
> - return -ENXIO;
> + irq = fwnode_irq_get(dev_fwnode(pcie->dev), port->idx);
> + if (irq < 0)
> + return irq;
[Severity: High]
This isn't a bug introduced by this patch, but returning the error here
(which can now be -EPROBE_DEFER) exposes a missing teardown path in
apple_pcie_init().
When apple_pcie_port_setup_irq() returns an error, apple_pcie_setup_port()
and then apple_pcie_init() abort without tearing down previously initialized
ports:
drivers/pci/controller/pcie-apple.c:apple_pcie_init() {
...
for_each_available_child_of_node_scoped(dev->of_node, of_port) {
ret = apple_pcie_setup_port(pcie, of_port);
if (ret) {
dev_err(dev, "Port %pOF setup fail: %d\n", of_port, ret);
return ret;
}
}
...
}
Because the chained handlers (irq_set_chained_handler_and_data) and IRQ
domains (irq_domain_create_linear) set up for previous ports are not managed
by devres, they remain active.
Devres will free the port structures, so if an interrupt fires or a re-probe
occurs, won't apple_port_irq_handler() dereference a freed port pointer?
[Severity: High]
This is also a pre-existing issue, but propagating an error like
-EPROBE_DEFER here makes a leak in apple_pcie_probe() much more reachable.
If this error propagates up and causes pci_host_common_init() to fail in
apple_pcie_probe(), the MSI parent IRQ domain created earlier by
apple_msi_init() is not removed:
drivers/pci/controller/pcie-apple.c:apple_pcie_probe() {
...
ret = apple_msi_init(pcie);
if (ret)
return ret;
...
return pci_host_common_init(pdev, bridge, &apple_pcie_cfg_ecam_ops);
}
The domain created via msi_create_parent_irq_domain() is not devres-managed.
Devres will free the pcie structure on error, leaving the leaked domain's
host_data pointing to freed memory.
On re-probe, IRQ lookups will match the leaked domain, and
apple_msi_domain_alloc() will dereference the freed pcie pointer.
Should there be manual cleanup for the MSI domain when pci_host_common_init()
fails?
>
> port->domain = irq_domain_create_linear(fwnode, 32,
> &apple_port_irq_domain_ops,
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260722231214.857760-1-rosenp@gmail.com?part=1
prev parent reply other threads:[~2026-07-22 23:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 23:12 [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup Rosen Penev
2026-07-22 23:24 ` sashiko-bot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260722232445.4CC101F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=rosenp@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.