diff options
author | Philipp Zabel <[email protected]> | 2023-05-24 14:29:24 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <[email protected]> | 2023-05-26 10:57:47 +0100 |
commit | 5aa8de7ad14f3bb7c39a67a63767de50b5fe122d (patch) | |
tree | 1d4662a2be99d9455c7029091fc3bb5439f9a940 | |
parent | fe1b585ce91da47af7e7f8985428099d52eeca3c (diff) |
media: video-mux: fix error paths
Move notifier cleanup into video_mux_async_register() to avoid calling
v4l2_async_nf_unregister() when v4l2_async_subdev_nf_register() failed.
In case video_mux_async_register() fails, call media_entity_cleanup().
Signed-off-by: Philipp Zabel <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
-rw-r--r-- | drivers/media/platform/video-mux.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c index b244873d593a..4fe31386afc7 100644 --- a/drivers/media/platform/video-mux.c +++ b/drivers/media/platform/video-mux.c @@ -389,7 +389,7 @@ static int video_mux_async_register(struct video_mux *vmux, ret = PTR_ERR(asd); /* OK if asd already exists */ if (ret != -EEXIST) - return ret; + goto err_nf_cleanup; } } @@ -397,9 +397,19 @@ static int video_mux_async_register(struct video_mux *vmux, ret = v4l2_async_subdev_nf_register(&vmux->subdev, &vmux->notifier); if (ret) - return ret; + goto err_nf_cleanup; + + ret = v4l2_async_register_subdev(&vmux->subdev); + if (ret) + goto err_nf_unregister; - return v4l2_async_register_subdev(&vmux->subdev); + return 0; + +err_nf_unregister: + v4l2_async_nf_unregister(&vmux->notifier); +err_nf_cleanup: + v4l2_async_nf_cleanup(&vmux->notifier); + return ret; } static int video_mux_probe(struct platform_device *pdev) @@ -473,12 +483,13 @@ static int video_mux_probe(struct platform_device *pdev) vmux->subdev.entity.ops = &video_mux_ops; ret = video_mux_async_register(vmux, num_pads - 1); - if (ret) { - media_entity_cleanup(&vmux->subdev.entity); - v4l2_async_nf_unregister(&vmux->notifier); - v4l2_async_nf_cleanup(&vmux->notifier); - } + if (ret) + goto err_entity_cleanup; + + return 0; +err_entity_cleanup: + media_entity_cleanup(&vmux->subdev.entity); return ret; } |