From: sashiko-bot@kernel.org
To: "Radu Rendec" <radu@rendec.net>
Cc: devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH] of/irq: Document of_irq_init() device node refcount contract
Date: Fri, 09 Oct 2026 01:19:18 +0000 [thread overview]
Message-ID: <sashiko-outbox-164696@kernel.org> (raw)
In-Reply-To: <20261009011324.1503697-1-radu@rendec.net>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] of/irq: false API contract documentation encourages use-after-free
--
commit 553b68f6aa4fe4b4ead9f98bb63dfba3cbd9c9a9
Author: Radu Rendec <radu@rendec.net>
of/irq: Document of_irq_init() device node refcount contract
This commit adds documentation to of_irq_init() claiming that the device
node refcount is intentionally never dropped upon successful initialization.
> diff --git a/drivers/of/irq.c b/drivers/of/irq.c
> index ef1ed9743907b..bf277781cdb6c 100644
> --- a/drivers/of/irq.c
> +++ b/drivers/of/irq.c
> @@ -647,6 +647,15 @@ struct of_intc_desc {
> *
> * This function scans the device tree for matching interrupt controller nodes,
> * and calls their initialization functions in order with parents first.
> + *
> + * The initialization functions are called while holding a refcount on the
> + * device node corresponding to the device that is being initialized (passed
> + * as the first parameter). If an initialization function is successful, the
> + * device node refcount is *not* dropped (ever); this is intentional and
> + * guarantees that the pointer passed to the initialization function is valid
> + * not only while the function runs, but also for the rest of the kernel
> + * lifetime (i.e. it is safe for a driver to store the device node pointer
> + * and use it *after* the initialization function returns).
> */
> void __init of_irq_init(const struct of_device_id *matches)
> {
[Severity: Medium]
Does this documentation accurately reflect the code's behavior?
Looking at the end of of_irq_init() in drivers/of/irq.c, there is a cleanup
loop that explicitly drops the device node refcounts for successfully
initialized controllers remaining in the parent list:
list_for_each_entry_safe(desc, temp_desc, &intc_parent_list, list) {
list_del(&desc->list);
of_node_put(desc->interrupt_parent);
of_node_put(desc->dev);
kfree(desc);
}
Any successfully initialized leaf interrupt controller, and any sibling
controllers remaining in intc_parent_list when intc_desc_list becomes empty,
will have their references dropped by this final drain loop.
The documentation appears to mistake a pre-existing memory leak (where parent
controllers popped during the while loop leak their references) for an
intentional, universal API contract, while ignoring this final drain loop that
cleans up the remaining nodes.
If driver authors rely on this newly documented contract, they might assume
they do not need to take their own reference on the device node. Could this
lead to a use-after-free when the final loop drops the reference?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261009011324.1503697-1-radu@rendec.net?part=1
next prev parent reply other threads:[~2026-10-09 1:19 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 1:13 [PATCH] of/irq: Document of_irq_init() device node refcount contract Radu Rendec
2026-10-09 1:19 ` sashiko-bot [this message]
2026-10-10 15:03 ` Radu Rendec
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=sashiko-outbox-164696@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=radu@rendec.net \
--cc=robh@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox