To clarify, while there is no early exit path in the for_each_available_child_of_node() loop, the reference leak can still occur because the macro increments the reference count for each node it processes. If i2c_new_client_device() fails, the reference count for that node must be explicitly decremented using of_node_put(node). Without this, the reference count remains elevated, leading to a reference leak.
sunny
On Sun, 6 Apr 2025 at 23:36, Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> wrote:
Le 06/04/2025 à 15:48, Sunny Patel a écrit :
> Fix a potential reference leak in of_i2c_register_devices where the
> reference to the node is not released if device registration fails.
> This ensures proper reference management and avoids memory leaks.
There is no early exit path in the for_each_available_child_of_node()
block, so of_node_put((node) is called for all the nodes that are
iterated.
Can you elaborate and explain how the reference leak can occur?
CJ
>
> Signed-off-by: Sunny Patel <nueralspacetech@xxxxxxxxx>
> ---
> drivers/i2c/i2c-core-of.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c
> index 02feee6c9ba9..7c50905de8f1 100644
> --- a/drivers/i2c/i2c-core-of.c
> +++ b/drivers/i2c/i2c-core-of.c
> @@ -107,6 +107,7 @@ void of_i2c_register_devices(struct
i2c_adapter *adap)
> "Failed to create I2C device for
%pOF\n",
> node);
> of_node_clear_flag(node, OF_POPULATED);
> + of_node_put(node);
> }
> }
>