of/irq: Fix device node refcount leakage in API of_irq_parse_raw()
commit ff93e7213d6cc8d9a7b0bc64f70ed26094e168f3 upstream.
if the node @out_irq->np got by of_irq_parse_raw() is a combo node which
consists of both controller and nexus, namely, of_irq_parse_raw() returns
due to condition (@ipar == @newpar), then the node's refcount was increased
twice, hence causes refcount leakage.
Fix by putting @out_irq->np refcount before returning due to the condition.
Also add comments about refcount of node @out_irq->np got by the API.
Fixes: 0412841812 ("of/irq: Allow matching of an interrupt-map local to an interrupt controller")
Cc: stable@vger.kernel.org
Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com>
Link: https://lore.kernel.org/r/20250209-of_irq_fix-v2-4-93e3a2659aa7@quicinc.com
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
dc83eccc93
commit
3540164c75
@@ -166,6 +166,8 @@ const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len, struct of_ph
|
|||||||
* the specifier for each map, and then returns the translated map.
|
* the specifier for each map, and then returns the translated map.
|
||||||
*
|
*
|
||||||
* Return: 0 on success and a negative number on error
|
* Return: 0 on success and a negative number on error
|
||||||
|
*
|
||||||
|
* Note: refcount of node @out_irq->np is increased by 1 on success.
|
||||||
*/
|
*/
|
||||||
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||||
{
|
{
|
||||||
@@ -311,6 +313,12 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
|||||||
addrsize = (imap - match_array) - intsize;
|
addrsize = (imap - match_array) - intsize;
|
||||||
|
|
||||||
if (ipar == newpar) {
|
if (ipar == newpar) {
|
||||||
|
/*
|
||||||
|
* We got @ipar's refcount, but the refcount was
|
||||||
|
* gotten again by of_irq_parse_imap_parent() via its
|
||||||
|
* alias @newpar.
|
||||||
|
*/
|
||||||
|
of_node_put(ipar);
|
||||||
pr_debug("%pOF interrupt-map entry to self\n", ipar);
|
pr_debug("%pOF interrupt-map entry to self\n", ipar);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user