mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
spmi: Fix potential use-after-free by grabbing of_node reference
As noticed by Sashiko during a review run of an unrelated patch,
in of_spmi_register_devices(), for_each_available_child_of_node()
is used to loop through children, and to also assign a node to a
newly created SPMI child device.
Problem is that the refcount is dropped at every iteration so, in
the specific case of DT overlays, a use-after-free may occur when
an overlay is dynamically unloaded!
To resolve this, increase the of_node refcount when assigning (in
function of_spmi_register_devices) and release the reference in
spmi_device_remove().
Fixes: bc32bbd040 ("spmi: Set fwnode for spmi devices")
Cc: stable@vger.kernel.org
Reported-by: Sashiko Bot <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260608100949.36309-1-angelogioacchino.delregno@collabora.com?part=2
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
84c72fc05f
commit
f7aa9de4f2
|
|
@ -24,6 +24,7 @@ static void spmi_dev_release(struct device *dev)
|
|||
{
|
||||
struct spmi_device *sdev = to_spmi_device(dev);
|
||||
|
||||
of_node_put(dev->of_node);
|
||||
kfree(sdev);
|
||||
}
|
||||
|
||||
|
|
@ -517,7 +518,7 @@ static void of_spmi_register_devices(struct spmi_controller *ctrl)
|
|||
if (!sdev)
|
||||
continue;
|
||||
|
||||
device_set_node(&sdev->dev, of_fwnode_handle(node));
|
||||
device_set_node(&sdev->dev, of_fwnode_handle(of_node_get(node)));
|
||||
sdev->usid = (u8)reg[0];
|
||||
|
||||
err = spmi_device_add(sdev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user