* [PATCH v2 1/8] driver core: platform: fix swnode use-after-free on device release
[not found] <20261110085125.2535508-1-johan@kernel.org>
@ 2026-11-10 8:51 ` Johan Hovold
2026-11-10 8:51 ` [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration Johan Hovold
1 sibling, 0 replies; 4+ messages in thread
From: Johan Hovold @ 2026-11-10 8:51 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Johan Hovold
Cc: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Bartosz Golaszewski, Andi Shyti, driver-core, linux-acpi,
linux-i2c, linux-kernel, stable, Bartosz Golaszewski
When a device has a software node, device_remove_software_node() may
drop the last reference and free it during platform_device_release().
If the software node is the also the primary node then the device fwnode
pointer is never cleared.
Use a temporary variable to track whether the firmware node is a
software node to avoid a use-after-free in is_software_node() and having
fwnode_handle_put() call a function pointer via poisoned or reallocated
memory when the primary node is a software node.
This issue was flagged by Sashiko when reviewing a related fix.
Fixes: 7d80509ff0da ("driver core: platform: unify release path")
Closes: https://sashiko.dev/#/bug/linux-b860000b-f1d0-46a0-ab52-d47cec8eab99
Cc: stable@vger.kernel.org # 7.3
Cc: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
---
drivers/base/platform.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 979593e5cca1..be5d2f315fdb 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -598,13 +598,14 @@ static void platform_device_release(struct device *dev)
{
struct platform_object *pa = container_of(dev, struct platform_object,
pdev.dev);
+ bool fwnode_is_software_node = is_software_node(dev_fwnode(dev));
device_remove_software_node(dev);
/*
- * If the primary firmware node is a software node, its reference count
- * was already decreased by the call to device_remove_software_node().
+ * If the firmware node is a software node, its reference count
+ * was decremented by device_remove_software_node().
*/
- if (!is_software_node(dev_fwnode(dev)))
+ if (!fwnode_is_software_node)
fwnode_handle_put(pa->pdev.dev.fwnode);
kfree(pa->pdev.dev.platform_data);
kfree(pa->pdev.mfd_cell);
--
2.56.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration
[not found] <20261110085125.2535508-1-johan@kernel.org>
2026-11-10 8:51 ` [PATCH v2 1/8] driver core: platform: fix swnode use-after-free on device release Johan Hovold
@ 2026-11-10 8:51 ` Johan Hovold
2026-11-10 10:58 ` Andy Shevchenko
1 sibling, 1 reply; 4+ messages in thread
From: Johan Hovold @ 2026-11-10 8:51 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Johan Hovold
Cc: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Bartosz Golaszewski, Andi Shyti, driver-core, linux-acpi,
linux-i2c, linux-kernel, stable, Hans de Goede
If a client has both a primary and a secondary firmware node, the
secondary node is accessed via the ->secondary pointer of the primary
node.
Use a temporary variable to track whether the firmware node is a
software node and remove any software node before dropping its reference
to avoid a use-after-free in device_remove_software_node() when
accessing the secondary firmware node.
Fixes: df6d7277e552 ("i2c: core: Do not dereference fwnode in struct device")
Fixes: 1c24e5fc0c70 ("i2c: core: Fix double-free of fwnode in i2c_unregister_device()")
Cc: stable@vger.kernel.org # 6.16
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Hans de Goede <hansg@kernel.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
---
drivers/i2c/i2c-core-base.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 81603317b64d..c55ca14eaad9 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -1056,6 +1056,7 @@ EXPORT_SYMBOL_GPL(i2c_new_client_device);
void i2c_unregister_device(struct i2c_client *client)
{
struct fwnode_handle *fwnode;
+ bool fwnode_is_software_node;
if (IS_ERR_OR_NULL(client))
return;
@@ -1066,14 +1067,14 @@ void i2c_unregister_device(struct i2c_client *client)
else if (is_acpi_device_node(fwnode))
acpi_device_clear_enumerated(to_acpi_device_node(fwnode));
+ fwnode_is_software_node = is_software_node(fwnode);
+ device_remove_software_node(&client->dev);
/*
- * If the primary fwnode is a software node it is free-ed by
- * device_remove_software_node() below, avoid double-free.
+ * If the firmware node is a software node, its reference count
+ * was decremented by device_remove_software_node().
*/
- if (!is_software_node(fwnode))
+ if (!fwnode_is_software_node)
fwnode_handle_put(fwnode);
-
- device_remove_software_node(&client->dev);
device_unregister(&client->dev);
}
EXPORT_SYMBOL_GPL(i2c_unregister_device);
--
2.56.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration
2026-11-10 8:51 ` [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration Johan Hovold
@ 2026-11-10 10:58 ` Andy Shevchenko
2026-11-10 11:15 ` Johan Hovold
0 siblings, 1 reply; 4+ messages in thread
From: Andy Shevchenko @ 2026-11-10 10:58 UTC (permalink / raw)
To: Johan Hovold
Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Bartosz Golaszewski,
Andi Shyti, driver-core, linux-acpi, linux-i2c, linux-kernel,
stable, Hans de Goede
On Tue, Nov 10, 2026 at 09:51:18AM +0100, Johan Hovold wrote:
> If a client has both a primary and a secondary firmware node, the
> secondary node is accessed via the ->secondary pointer of the primary
> node.
>
> Use a temporary variable to track whether the firmware node is a
> software node and remove any software node before dropping its reference
> to avoid a use-after-free in device_remove_software_node() when
> accessing the secondary firmware node.
...
> Fixes: df6d7277e552 ("i2c: core: Do not dereference fwnode in struct device")
> Fixes: 1c24e5fc0c70 ("i2c: core: Fix double-free of fwnode in i2c_unregister_device()")
> Cc: stable@vger.kernel.org # 6.16
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Hans de Goede <hansg@kernel.org>
Can we keep these two Cc out of the commit message?
> Signed-off-by: Johan Hovold <johan@kernel.org>
> ---
...
> struct fwnode_handle *fwnode;
> + bool fwnode_is_software_node;
>
> if (IS_ERR_OR_NULL(client))
> return;
> @@ -1066,14 +1067,14 @@ void i2c_unregister_device(struct i2c_client *client)
> else if (is_acpi_device_node(fwnode))
> acpi_device_clear_enumerated(to_acpi_device_node(fwnode));
>
> + fwnode_is_software_node = is_software_node(fwnode);
> + device_remove_software_node(&client->dev);
> /*
> - * If the primary fwnode is a software node it is free-ed by
> - * device_remove_software_node() below, avoid double-free.
> + * If the firmware node is a software node, its reference count
> + * was decremented by device_remove_software_node().
> */
> - if (!is_software_node(fwnode))
> + if (!fwnode_is_software_node)
> fwnode_handle_put(fwnode);
Do I understand correctly that this is a dup with the platform device case? Can
we make a helper (on swnode API level) to cover any other existing or potential
case to avoid similar issues in the future?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration
2026-11-10 10:58 ` Andy Shevchenko
@ 2026-11-10 11:15 ` Johan Hovold
0 siblings, 0 replies; 4+ messages in thread
From: Johan Hovold @ 2026-11-10 11:15 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Bartosz Golaszewski,
Andi Shyti, driver-core, linux-acpi, linux-i2c, linux-kernel,
stable, Hans de Goede
On Tue, Nov 10, 2026 at 12:58:15PM +0200, Andy Shevchenko wrote:
> On Tue, Nov 10, 2026 at 09:51:18AM +0100, Johan Hovold wrote:
> > If a client has both a primary and a secondary firmware node, the
> > secondary node is accessed via the ->secondary pointer of the primary
> > node.
> >
> > Use a temporary variable to track whether the firmware node is a
> > software node and remove any software node before dropping its reference
> > to avoid a use-after-free in device_remove_software_node() when
> > accessing the secondary firmware node.
>
> ...
>
> > Fixes: df6d7277e552 ("i2c: core: Do not dereference fwnode in struct device")
> > Fixes: 1c24e5fc0c70 ("i2c: core: Fix double-free of fwnode in i2c_unregister_device()")
> > Cc: stable@vger.kernel.org # 6.16
>
> > Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Cc: Hans de Goede <hansg@kernel.org>
>
> Can we keep these two Cc out of the commit message?
I prefer to highlight the authors of the commits mentioned in the Fixes
tag this way.
> > Signed-off-by: Johan Hovold <johan@kernel.org>
> > ---
> > @@ -1066,14 +1067,14 @@ void i2c_unregister_device(struct i2c_client *client)
> > else if (is_acpi_device_node(fwnode))
> > acpi_device_clear_enumerated(to_acpi_device_node(fwnode));
> >
> > + fwnode_is_software_node = is_software_node(fwnode);
> > + device_remove_software_node(&client->dev);
> > /*
> > - * If the primary fwnode is a software node it is free-ed by
> > - * device_remove_software_node() below, avoid double-free.
> > + * If the firmware node is a software node, its reference count
> > + * was decremented by device_remove_software_node().
> > */
> > - if (!is_software_node(fwnode))
> > + if (!fwnode_is_software_node)
> > fwnode_handle_put(fwnode);
>
> Do I understand correctly that this is a dup with the platform device case? Can
> we make a helper (on swnode API level) to cover any other existing or potential
> case to avoid similar issues in the future?
The bug is different, but the fix is the same. This all gets cleaned up
in patch 4/8.
Johan
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-11-10 11:15 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20261110085125.2535508-1-johan@kernel.org>
2026-11-10 8:51 ` [PATCH v2 1/8] driver core: platform: fix swnode use-after-free on device release Johan Hovold
2026-11-10 8:51 ` [PATCH v2 2/8] i2c: core: fix swnode use-after-free on client deregistration Johan Hovold
2026-11-10 10:58 ` Andy Shevchenko
2026-11-10 11:15 ` Johan Hovold
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox