media: go7007: fix memory leaks on probe error paths

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@kylinos.cn>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
Chen Changcheng 2026-07-15 09:56:00 +08:00 committed by Hans Verkuil
parent 330f2936ab
commit bf2909f85c

View File

@ -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);