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

Commit 6ed9b285 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab
Browse files

[media] V4L2: fix VIDIOC_CREATE_BUFS 32-bit compatibility mode data copy-back



Similar to an earlier patch, fixing reading user-space data for the
VIDIOC_CREATE_BUFS ioctl() in 32-bit compatibility mode, this patch fixes
writing back of the possibly modified struct to the user. However, unlike
the former bug, this one is much less harmful, because it only results in
the kernel failing to write the .type field back to the user, but in fact
this is likely unneeded, because the kernel will hardly want to change
that field. Therefore this bug is more of a theoretical nature.

Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 66ae9fc2
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -222,6 +222,9 @@ static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_


static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
{
{
	if (put_user(kp->type, &up->type))
		return -EFAULT;

	switch (kp->type) {
	switch (kp->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
@@ -248,8 +251,7 @@ static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us


static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
{
{
	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)) ||
	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)))
		put_user(kp->type, &up->type))
		return -EFAULT;
		return -EFAULT;
	return __put_v4l2_format32(kp, up);
	return __put_v4l2_format32(kp, up);
}
}
@@ -257,7 +259,7 @@ static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user
static int put_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up)
static int put_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up)
{
{
	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_create_buffers32)) ||
	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_create_buffers32)) ||
	    copy_to_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt)))
	    copy_to_user(up, kp, offsetof(struct v4l2_create_buffers32, format)))
		return -EFAULT;
		return -EFAULT;
	return __put_v4l2_format32(&kp->format, &up->format);
	return __put_v4l2_format32(&kp->format, &up->format);
}
}