media: allegro: add missed checks in allegro_open()

allegro_open() misses checks for v4l2_m2m_ctx_init() and results of
v4l2_ctrl_new* calls.
Add checks and error handlers to fix the problems.

Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Chuhong Yuan 2020-01-13 06:59:51 +01:00 committed by Mauro Carvalho Chehab
parent 6b212c0cd5
commit cc62c74749

View file

@ -2270,15 +2270,12 @@ static int allegro_open(struct file *file)
struct allegro_channel *channel = NULL;
struct v4l2_ctrl_handler *handler;
u64 mask;
int ret;
channel = kzalloc(sizeof(*channel), GFP_KERNEL);
if (!channel)
return -ENOMEM;
v4l2_fh_init(&channel->fh, vdev);
file->private_data = &channel->fh;
v4l2_fh_add(&channel->fh);
init_completion(&channel->completion);
channel->dev = dev;
@ -2328,6 +2325,11 @@ static int allegro_open(struct file *file)
V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
1, 32,
1, 1);
if (handler->error != 0) {
ret = handler->error;
goto error;
}
channel->fh.ctrl_handler = handler;
channel->mcu_channel_id = -1;
@ -2341,7 +2343,21 @@ static int allegro_open(struct file *file)
channel->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, channel,
allegro_queue_init);
if (IS_ERR(channel->fh.m2m_ctx)) {
ret = PTR_ERR(channel->fh.m2m_ctx);
goto error;
}
v4l2_fh_init(&channel->fh, vdev);
file->private_data = &channel->fh;
v4l2_fh_add(&channel->fh);
return 0;
error:
v4l2_ctrl_handler_free(handler);
kfree(channel);
return ret;
}
static int allegro_release(struct file *file)