diff options
| author | Ma Ke <make_ruc2021@163.com> | 2026-10-12 09:34:21 +0800 |
|---|---|---|
| committer | Andi Shyti <andi.shyti@linux.intel.com> | 2026-10-22 21:22:14 +0200 |
| commit | a65917d0a22f9b10694853b725f9cd399fc3ef4d (patch) | |
| tree | 7db198633ad199c149f4f66ec7bf2c33f2ca2d96 /tools/lib/python/kdoc | |
| parent | 02d9f7b8324d3a09b01c9a4c0ab0e6846e6691dc (diff) | |
i2c: acpi: Fix adapter reference leak in i2c_acpi_new_device_by_fwnode()
i2c_acpi_new_device_by_fwnode() obtains an i2c_adapter through
i2c_acpi_find_adapter_by_handle(). That helper uses bus_find_device()
internally, so it returns the adapter with a reference held:
adapter = i2c_verify_adapter(dev);
if (!adapter)
put_device(dev);
return adapter;
The reference is only put on the failure path inside that helper. The
caller owns it otherwise. i2c_acpi_new_device_by_fwnode() never drops
it, neither on the -EPROBE_DEFER path nor after
i2c_new_client_device(), so every call leaks one reference on the
adapter and the adapter can never be released.
i2c_new_client_device() does not consume that reference. It registers
the new client with the adapter as its parent, and device_add() takes
its own reference on the parent, which device_del() releases when the
client goes away. The reference obtained by the lookup is a separate
one and has to be dropped here.
i2c_acpi_notify() in the same file already does exactly this. It takes
the adapter from the same helper, registers the client through
i2c_acpi_register_device(), which calls i2c_new_client_device(), and
then puts the reference.
i2c_new_client_device() gives the client its own reference on the
adapter, so ours can be dropped unconditionally.
Found by code review.
Fixes: 605f8fc22442 ("i2c: core: Add new i2c_acpi_new_device helper function")
Signed-off-by: Ma Ke <make_ruc2021@163.com>
Cc: <stable@vger.kernel.org> # v4.12+
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://patch.msgid.link/20261012013421.3597430-1-make_ruc2021@163.com
Diffstat (limited to 'tools/lib/python/kdoc')
0 files changed, 0 insertions, 0 deletions
