[PATCH] media: go7007: only set audio_enabled if go7007_snd_init() succeeded

From: Xiang Mei

Date: Tue Sep 15 2026 - 23:45:46 EST


go7007_register_encoder() sets go->audio_enabled before calling
go7007_snd_init() and discards its return value. go7007_snd_init()
assigns go->snd_context only on success, so a failed ALSA setup leaves
audio_enabled set with snd_context still NULL. The disconnect path tests
audio_enabled and calls go7007_snd_remove(), which dereferences
snd_context unconditionally.

go7007_snd_init() returns -ENODEV once its never-decremented static card
counter reaches SNDRV_CARDS, so SNDRV_CARDS attach/detach cycles arm the
next attach; no memory pressure is needed.

Set go->audio_enabled only once go7007_snd_init() has succeeded.

Oops: general protection fault, probably for non-canonical address ...
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
Workqueue: usb_hub_wq hub_event
RIP: 0010:go7007_snd_remove (drivers/media/usb/go7007/snd-go7007.c:273)
Call Trace:
go7007_usb_disconnect (drivers/media/usb/go7007/go7007-usb.c:1336)
usb_unbind_interface (drivers/usb/core/driver.c:461)
device_remove (drivers/base/dd.c:618)
device_release_driver_internal (drivers/base/dd.c:1349)
bus_remove_device (drivers/base/bus.c:664)
device_del (drivers/base/core.c:3965)
usb_disable_device (drivers/usb/core/message.c:1478)
usb_disconnect
hub_event (drivers/usb/core/hub.c:5966)
process_one_work (kernel/workqueue.c:3396)
worker_thread (kernel/workqueue.c:3560)
kthread (kernel/kthread.c:436)
ret_from_fork (arch/x86/kernel/process.c:158)
ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
Kernel panic - not syncing: Fatal exception

Cc: stable@xxxxxxxxxxxxxxx
Fixes: 866b8695d67e ("Staging: add the go7007 video driver")
Reported-by: <co+ac0ebfcd53bd2316@xxxxxxx>
Assisted-by: LLM
Signed-off-by: Xiang Mei <xmei5@xxxxxxx>
---
drivers/media/usb/go7007/go7007-driver.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c
index 453ab5c3aa03..7db2440886b0 100644
--- a/drivers/media/usb/go7007/go7007-driver.c
+++ b/drivers/media/usb/go7007/go7007-driver.c
@@ -306,10 +306,9 @@ int go7007_register_encoder(struct go7007 *go, unsigned num_i2c_devs)
if (ret < 0)
goto err_free_controls;

- if (go->board_info->flags & GO7007_BOARD_HAS_AUDIO) {
+ if ((go->board_info->flags & GO7007_BOARD_HAS_AUDIO) &&
+ go7007_snd_init(go) == 0)
go->audio_enabled = 1;
- go7007_snd_init(go);
- }
return 0;

err_free_controls:
--
2.43.0