On Wed Jul 15 09:56:00 2026 +0800, Chen Changcheng wrote:
> 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 <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
Patch committed.
Thanks,
Hans Verkuil
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);
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]