mirror of
https://github.com/adulau/aha.git
synced 2025-01-03 22:53:18 +00:00
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>
This commit is contained in:
parent
95faba22d8
commit
eb4eeccc18
1 changed files with 24 additions and 0 deletions
|
@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct video_code32
|
||||||
|
{
|
||||||
|
char loadwhat[16]; /* name or tag of file being passed */
|
||||||
|
compat_int_t datasize;
|
||||||
|
unsigned char *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int microcode32(struct video_code *kp, struct video_code32 __user *up)
|
||||||
|
{
|
||||||
|
if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) ||
|
||||||
|
copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) ||
|
||||||
|
get_user(kp->datasize, &up->datasize) ||
|
||||||
|
copy_from_user(kp->data, up->data, up->datasize))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
||||||
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
||||||
#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
|
#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
|
||||||
#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
||||||
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
||||||
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
||||||
|
#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32)
|
||||||
|
|
||||||
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
||||||
#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
|
#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
|
||||||
struct video_tuner vt;
|
struct video_tuner vt;
|
||||||
struct video_buffer vb;
|
struct video_buffer vb;
|
||||||
struct video_window vw;
|
struct video_window vw;
|
||||||
|
struct video_code vc;
|
||||||
struct v4l2_format v2f;
|
struct v4l2_format v2f;
|
||||||
struct v4l2_buffer v2b;
|
struct v4l2_buffer v2b;
|
||||||
struct v4l2_framebuffer v2fb;
|
struct v4l2_framebuffer v2fb;
|
||||||
|
@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||||
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
||||||
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
||||||
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
||||||
|
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||||
};
|
};
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
|
@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||||
case VIDIOC_G_FBUF:
|
case VIDIOC_G_FBUF:
|
||||||
case VIDIOC_G_INPUT:
|
case VIDIOC_G_INPUT:
|
||||||
compatible_arg = 0;
|
compatible_arg = 0;
|
||||||
|
case VIDIOCSMICROCODE:
|
||||||
|
err = microcode32(&karg.vc, up);
|
||||||
|
compatible_arg = 0;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if(err)
|
if(err)
|
||||||
|
|
Loading…
Reference in a new issue