On Thu 18 July 2013 02:22:05 Laurent Pinchart wrote: > Hi Hans, > > Thanks for the patch. > > On Friday 28 June 2013 14:27:31 Hans Verkuil wrote: > > From: Hans Verkuil <hans.verkuil@xxxxxxxxx> > > > > Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> > > --- > > drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 55 ++++++++++++++++++++++++ > > 1 file changed, 55 insertions(+) > > > > diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c > > b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c index 8f7a6a4..64155b1 > > 100644 > > --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c > > +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c > > @@ -777,6 +777,44 @@ static int put_v4l2_subdev_edid32(struct > > v4l2_subdev_edid *kp, struct v4l2_subde return 0; > > } > > > > +struct v4l2_matrix32 { > > + __u32 type; > > + union { > > + __u32 reserved[4]; > > + } ref; > > + struct v4l2_rect rect; > > + compat_caddr_t matrix; > > + __u32 reserved[12]; > > +} __attribute__ ((packed)); > > + > > +static int get_v4l2_matrix32(struct v4l2_matrix *kp, struct v4l2_matrix32 > > __user *up) +{ > > + u32 tmp; > > + > > + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_matrix32)) || > > + get_user(kp->type, &up->type) || > > + copy_from_user(&kp->ref, &up->ref, sizeof(up->ref)) || > > + copy_from_user(&kp->rect, &up->rect, sizeof(up->rect)) || > > + get_user(tmp, &up->matrix) || > > + copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) > > + return -EFAULT; > > A bit of nit-picking here, the return is aligned too far right according to > the kernel coding style (same for put_v4l2_matrix32() below). Hmm, I copied-and-pasted this from another get/put function. I guess this is wrong in more places than just this one. > > > + kp->matrix = compat_ptr(tmp); > > + return 0; > > +} > > + > > +static int put_v4l2_matrix32(struct v4l2_matrix *kp, struct v4l2_matrix32 > > __user *up) > > +{ > > + u32 tmp = (u32)((unsigned long)kp->matrix); > > + > > + if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_matrix32)) || > > + put_user(kp->type, &up->type) || > > + copy_to_user(&kp->ref, &up->ref, sizeof(kp->ref)) || > > + copy_to_user(&kp->rect, &up->rect, sizeof(kp->rect)) || > > + put_user(tmp, &up->matrix) || > > Given that drivers shouldn't be allowed to modify the matrix pointer, could we > get rid of the put_user() here as a small optimization ? The same could be > done for all read-only (from a driver point of view) fields in the various > put_v4l2_* functions. Ditto. But it's a good idea. I'll look at it. Hans > > > > + copy_to_user(kp->reserved, up->reserved, sizeof(kp->reserved))) > > + return -EFAULT; > > + return 0; > > +} > > > > #define VIDIOC_G_FMT32 _IOWR('V', 4, struct v4l2_format32) > > #define VIDIOC_S_FMT32 _IOWR('V', 5, struct v4l2_format32) > > @@ -796,6 +834,8 @@ static int put_v4l2_subdev_edid32(struct > > v4l2_subdev_edid *kp, struct v4l2_subde #define VIDIOC_DQEVENT32 _IOR ('V', > > 89, struct v4l2_event32) > > #define VIDIOC_CREATE_BUFS32 _IOWR('V', 92, struct v4l2_create_buffers32) > > #define VIDIOC_PREPARE_BUF32 _IOWR('V', 93, struct v4l2_buffer32) > > +#define VIDIOC_G_MATRIX32 _IOWR('V', 104, struct v4l2_matrix32) > > +#define VIDIOC_S_MATRIX32 _IOWR('V', 105, struct v4l2_matrix32) > > > > #define VIDIOC_OVERLAY32 _IOW ('V', 14, s32) > > #define VIDIOC_STREAMON32 _IOW ('V', 18, s32) > > @@ -817,6 +857,7 @@ static long do_video_ioctl(struct file *file, unsigned > > int cmd, unsigned long ar struct v4l2_event v2ev; > > struct v4l2_create_buffers v2crt; > > struct v4l2_subdev_edid v2edid; > > + struct v4l2_matrix v2matrix; > > unsigned long vx; > > int vi; > > } karg; > > @@ -851,6 +892,8 @@ static long do_video_ioctl(struct file *file, unsigned > > int cmd, unsigned long ar case VIDIOC_PREPARE_BUF32: cmd = > > VIDIOC_PREPARE_BUF; break; > > case VIDIOC_SUBDEV_G_EDID32: cmd = VIDIOC_SUBDEV_G_EDID; break; > > case VIDIOC_SUBDEV_S_EDID32: cmd = VIDIOC_SUBDEV_S_EDID; break; > > + case VIDIOC_G_MATRIX32: cmd = VIDIOC_G_MATRIX; break; > > + case VIDIOC_S_MATRIX32: cmd = VIDIOC_S_MATRIX; break; > > } > > > > switch (cmd) { > > @@ -922,6 +965,12 @@ static long do_video_ioctl(struct file *file, unsigned > > int cmd, unsigned long ar case VIDIOC_DQEVENT: > > compatible_arg = 0; > > break; > > + > > + case VIDIOC_G_MATRIX: > > + case VIDIOC_S_MATRIX: > > + err = get_v4l2_matrix32(&karg.v2matrix, up); > > + compatible_arg = 0; > > + break; > > } > > if (err) > > return err; > > @@ -994,6 +1043,11 @@ static long do_video_ioctl(struct file *file, unsigned > > int cmd, unsigned long ar case VIDIOC_ENUMINPUT: > > err = put_v4l2_input32(&karg.v2i, up); > > break; > > + > > + case VIDIOC_G_MATRIX: > > + case VIDIOC_S_MATRIX: > > + err = put_v4l2_matrix32(&karg.v2matrix, up); > > + break; > > } > > return err; > > } > > @@ -1089,6 +1143,7 @@ long v4l2_compat_ioctl32(struct file *file, unsigned > > int cmd, unsigned long arg) case VIDIOC_ENUM_FREQ_BANDS: > > case VIDIOC_SUBDEV_G_EDID32: > > case VIDIOC_SUBDEV_S_EDID32: > > + case VIDIOC_QUERY_MATRIX: > > ret = do_video_ioctl(file, cmd, arg); > > break; > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html