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]

Reply via email to