Commit cc62c747 authored by Chuhong Yuan's avatar Chuhong Yuan Committed by Mauro Carvalho Chehab
Browse files

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: default avatarChuhong Yuan <hslester96@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 6b212c0c
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -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)