Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79dff2a3 authored by Evgeny Novikov's avatar Evgeny Novikov Committed by Sasha Levin
Browse files

media: zr364xx: propagate errors from zr364xx_start_readpipe()



[ Upstream commit af0321a5be3e5647441eb6b79355beaa592df97a ]

zr364xx_start_readpipe() can fail but callers do not care about that.
This can result in various negative consequences. The patch adds missed
error handling.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: default avatarEvgeny Novikov <novikov@ispras.ru>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 7305d6d4
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -1331,6 +1331,7 @@ static int zr364xx_board_init(struct zr364xx_camera *cam)
{
	struct zr364xx_pipeinfo *pipe = cam->pipe;
	unsigned long i;
	int err;

	DBG("board init: %p\n", cam);
	memset(pipe, 0, sizeof(*pipe));
@@ -1363,9 +1364,8 @@ static int zr364xx_board_init(struct zr364xx_camera *cam)

	if (i == 0) {
		printk(KERN_INFO KBUILD_MODNAME ": out of memory. Aborting\n");
		kfree(cam->pipe->transfer_buffer);
		cam->pipe->transfer_buffer = NULL;
		return -ENOMEM;
		err = -ENOMEM;
		goto err_free;
	} else
		cam->buffer.dwFrames = i;

@@ -1380,9 +1380,17 @@ static int zr364xx_board_init(struct zr364xx_camera *cam)
	/*** end create system buffers ***/

	/* start read pipe */
	zr364xx_start_readpipe(cam);
	err = zr364xx_start_readpipe(cam);
	if (err)
		goto err_free;

	DBG(": board initialized\n");
	return 0;

err_free:
	kfree(cam->pipe->transfer_buffer);
	cam->pipe->transfer_buffer = NULL;
	return err;
}

static int zr364xx_probe(struct usb_interface *intf,
@@ -1579,10 +1587,19 @@ static int zr364xx_resume(struct usb_interface *intf)
	if (!cam->was_streaming)
		return 0;

	zr364xx_start_readpipe(cam);
	res = zr364xx_start_readpipe(cam);
	if (res)
		return res;

	res = zr364xx_prepare(cam);
	if (!res)
	if (res)
		goto err_prepare;

	zr364xx_start_acquire(cam);
	return 0;

err_prepare:
	zr364xx_stop_readpipe(cam);
	return res;
}
#endif