aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2006-07-21 17:53:23 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-07-29 16:22:27 -0400
commiteb4eeccc18246c852fffc771efc3c07a547aeb97 (patch)
treeb2858509abb152306b6617cce44ec087154fbb04 /drivers/media
parent95faba22d8b81f0cd85b995232b7d05c45a26f3e (diff)
V4L/DVB (4341): VIDIOCSMICROCODE were missing on compat_ioctl32
video_code size is 24 on i386 and 32 on x86_64, so a proper handling is needed on compat_ioctl32 to fix it. This code should be tested, since just *a few* boards use this ioctl. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/compat_ioctl32.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c
index 353d02b67c33..9dddff42ec13 100644
--- a/drivers/media/video/compat_ioctl32.c
+++ b/drivers/media/video/compat_ioctl32.c
@@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
490 return 0; 490 return 0;
491} 491}
492 492
493struct video_code32
494{
495 char loadwhat[16]; /* name or tag of file being passed */
496 compat_int_t datasize;
497 unsigned char *data;
498};
499
500static inline int microcode32(struct video_code *kp, struct video_code32 __user *up)
501{
502 if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) ||
503 copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) ||
504 get_user(kp->datasize, &up->datasize) ||
505 copy_from_user(kp->data, up->data, up->datasize))
506 return -EFAULT;
507 return 0;
508}
509
493#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) 510#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
494#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) 511#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
495#define VIDIOCGWIN32 _IOR('v',9, struct video_window32) 512#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
@@ -498,6 +515,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
498#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) 515#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
499#define VIDIOCGFREQ32 _IOR('v',14, u32) 516#define VIDIOCGFREQ32 _IOR('v',14, u32)
500#define VIDIOCSFREQ32 _IOW('v',15, u32) 517#define VIDIOCSFREQ32 _IOW('v',15, u32)
518#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32)
501 519
502/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ 520/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
503#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) 521#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
@@ -590,6 +608,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
590 struct video_tuner vt; 608 struct video_tuner vt;
591 struct video_buffer vb; 609 struct video_buffer vb;
592 struct video_window vw; 610 struct video_window vw;
611 struct video_code vc;
593 struct v4l2_format v2f; 612 struct v4l2_format v2f;
594 struct v4l2_buffer v2b; 613 struct v4l2_buffer v2b;
595 struct v4l2_framebuffer v2fb; 614 struct v4l2_framebuffer v2fb;
@@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
628 case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; 647 case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
629 case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; 648 case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
630 case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; 649 case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
650 case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
631 }; 651 };
632 652
633 switch(cmd) { 653 switch(cmd) {
@@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
703 case VIDIOC_G_FBUF: 723 case VIDIOC_G_FBUF:
704 case VIDIOC_G_INPUT: 724 case VIDIOC_G_INPUT:
705 compatible_arg = 0; 725 compatible_arg = 0;
726 case VIDIOCSMICROCODE:
727 err = microcode32(&karg.vc, up);
728 compatible_arg = 0;
729 break;
706 }; 730 };
707 731
708 if(err) 732 if(err)