[PATCH] media: go7007: fix memory leaks on probe error paths
From: Chen Changcheng
Date: Tue Jul 14 2026 - 21:56:23 EST
In go7007_register_encoder(), if any step after
v4l2_device_register() fails (go7007_init_encoder,
go7007_v4l2_ctrl_init, go7007_i2c_init, go7007_v4l2_init), the
function returns directly without cleanup, leaking the registered
V4L2 device and the control handler (if already initialized).
Add cascade error labels that properly release resources according
to how far initialization has progressed:
- err_free_controls: frees the control handler
- err_unregister_v4l2_dev: unregisters the V4L2 device (reached
from any failure after v4l2_device_register)
Signed-off-by: Chen Changcheng <chenchangcheng@xxxxxxxxxx>
---
drivers/media/usb/go7007/go7007-driver.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c
index 25b3ee25aaa4..453ab5c3aa03 100644
--- a/drivers/media/usb/go7007/go7007-driver.c
+++ b/drivers/media/usb/go7007/go7007-driver.c
@@ -264,17 +264,17 @@ int go7007_register_encoder(struct go7007 *go, unsigned num_i2c_devs)
ret = go7007_init_encoder(go);
mutex_unlock(&go->hw_lock);
if (ret < 0)
- return ret;
+ goto err_unregister_v4l2_dev;
ret = go7007_v4l2_ctrl_init(go);
if (ret < 0)
- return ret;
+ goto err_free_controls;
if (!go->i2c_adapter_online &&
go->board_info->flags & GO7007_BOARD_USE_ONBOARD_I2C) {
ret = go7007_i2c_init(go);
if (ret < 0)
- return ret;
+ goto err_free_controls;
go->i2c_adapter_online = 1;
}
if (go->i2c_adapter_online) {
@@ -304,13 +304,19 @@ int go7007_register_encoder(struct go7007 *go, unsigned num_i2c_devs)
ret = go7007_v4l2_init(go);
if (ret < 0)
- return ret;
+ goto err_free_controls;
if (go->board_info->flags & GO7007_BOARD_HAS_AUDIO) {
go->audio_enabled = 1;
go7007_snd_init(go);
}
return 0;
+
+err_free_controls:
+ v4l2_ctrl_handler_free(&go->hdl);
+err_unregister_v4l2_dev:
+ v4l2_device_unregister(&go->v4l2_dev);
+ return ret;
}
EXPORT_SYMBOL(go7007_register_encoder);
--
2.25.1