mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
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:
parent
330f2936ab
commit
bf2909f85c
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user