ASoC: soc-core: care NULL dirver name on snd_soc_lookup_component_nolocked()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 19 Aug 2025 01:58:51 +0000 (01:58 +0000)
committerMark Brown <broonie@kernel.org>
Sun, 24 Aug 2025 21:40:50 +0000 (22:40 +0100)
soc-generic-dmaengine-pcm.c uses same dev for both CPU and Platform.
In such case, CPU component driver might not have driver->name, then
snd_soc_lookup_component_nolocked() will be NULL pointer access error.
Care NULL driver name.

Call trace:
 strcmp from snd_soc_lookup_component_nolocked+0x64/0xa4
 snd_soc_lookup_component_nolocked from snd_soc_unregister_component_by_driver+0x2c/0x44
 snd_soc_unregister_component_by_driver from snd_dmaengine_pcm_unregister+0x28/0x64
 snd_dmaengine_pcm_unregister from devres_release_all+0x98/0xfc
 devres_release_all from device_unbind_cleanup+0xc/0x60
 device_unbind_cleanup from really_probe+0x220/0x2c8
 really_probe from __driver_probe_device+0x88/0x1a0
 __driver_probe_device from driver_probe_device+0x30/0x110
driver_probe_device from __driver_attach+0x90/0x178
__driver_attach from bus_for_each_dev+0x7c/0xcc
bus_for_each_dev from bus_add_driver+0xcc/0x1ec
bus_add_driver from driver_register+0x80/0x11c
driver_register from do_one_initcall+0x58/0x23c
do_one_initcall from kernel_init_freeable+0x198/0x1f4
kernel_init_freeable from kernel_init+0x1c/0x12c
kernel_init from ret_from_fork+0x14/0x28

Fixes: 144d6dfc7482 ("ASoC: soc-core: merge snd_soc_unregister_component() and snd_soc_unregister_component_by_driver()")
Reported-by: J. Neuschäfer <j.ne@posteo.net>
Closes: https://lore.kernel.org/r/aJb311bMDc9x-dpW@probook
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Reported-by: Ondřej Jirman <megi@xff.cz>
Closes: https://lore.kernel.org/r/arxpwzu6nzgjxvsndct65ww2wz4aezb5gjdzlgr24gfx7xvyih@natjg6dg2pj6
Tested-by: J. Neuschäfer <j.ne@posteo.net>
Message-ID: <87ect8ysv8.wl-kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-core.c

index 37bc5867f81d4a7aa9f979da754cd7ef231afb60..c1cf205e0556954aef0e5ffc8da103027a155a27 100644 (file)
@@ -375,8 +375,9 @@ struct snd_soc_component
        for_each_component(component) {
                if ((dev == component->dev) &&
                    (!driver_name ||
-                    (driver_name == component->driver->name) ||
-                    (strcmp(component->driver->name, driver_name) == 0))) {
+                    (component->driver->name &&
+                     ((component->driver->name == driver_name) ||
+                      (strcmp(component->driver->name, driver_name) == 0))))) {
                        found_component = component;
                        break;
                }