diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-compat-ioctl32.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 147 | 
1 files changed, 30 insertions, 117 deletions
diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c index 8f7a6a454a4..7e2411c3641 100644 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c @@ -178,6 +178,9 @@ struct v4l2_create_buffers32 {  static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)  { +	if (get_user(kp->type, &up->type)) +		return -EFAULT; +  	switch (kp->type) {  	case V4L2_BUF_TYPE_VIDEO_CAPTURE:  	case V4L2_BUF_TYPE_VIDEO_OUTPUT: @@ -204,17 +207,16 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us  static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)  { -	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32)) || -			get_user(kp->type, &up->type)) -			return -EFAULT; +	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) +		return -EFAULT;  	return __get_v4l2_format32(kp, up);  }  static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up)  {  	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32)) || -	    copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format.fmt))) -			return -EFAULT; +	    copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) +		return -EFAULT;  	return __get_v4l2_format32(&kp->format, &up->format);  } @@ -733,14 +735,14 @@ static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *u  		copy_to_user(&up->u, &kp->u, sizeof(kp->u)) ||  		put_user(kp->pending, &up->pending) ||  		put_user(kp->sequence, &up->sequence) || -		put_compat_timespec(&kp->timestamp, &up->timestamp) || +		compat_put_timespec(&kp->timestamp, &up->timestamp) ||  		put_user(kp->id, &up->id) ||  		copy_to_user(up->reserved, kp->reserved, 8 * sizeof(__u32)))  			return -EFAULT;  	return 0;  } -struct v4l2_subdev_edid32 { +struct v4l2_edid32 {  	__u32 pad;  	__u32 start_block;  	__u32 blocks; @@ -748,11 +750,11 @@ struct v4l2_subdev_edid32 {  	compat_caddr_t edid;  }; -static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) +static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up)  {  	u32 tmp; -	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_subdev_edid32)) || +	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_edid32)) ||  		get_user(kp->pad, &up->pad) ||  		get_user(kp->start_block, &up->start_block) ||  		get_user(kp->blocks, &up->blocks) || @@ -763,11 +765,11 @@ static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde  	return 0;  } -static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) +static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up)  {  	u32 tmp = (u32)((unsigned long)kp->edid); -	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_subdev_edid32)) || +	if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_edid32)) ||  		put_user(kp->pad, &up->pad) ||  		put_user(kp->start_block, &up->start_block) ||  		put_user(kp->blocks, &up->blocks) || @@ -787,8 +789,8 @@ static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde  #define VIDIOC_DQBUF32		_IOWR('V', 17, struct v4l2_buffer32)  #define VIDIOC_ENUMSTD32	_IOWR('V', 25, struct v4l2_standard32)  #define VIDIOC_ENUMINPUT32	_IOWR('V', 26, struct v4l2_input32) -#define VIDIOC_SUBDEV_G_EDID32	_IOWR('V', 63, struct v4l2_subdev_edid32) -#define VIDIOC_SUBDEV_S_EDID32	_IOWR('V', 64, struct v4l2_subdev_edid32) +#define VIDIOC_G_EDID32		_IOWR('V', 40, struct v4l2_edid32) +#define VIDIOC_S_EDID32		_IOWR('V', 41, struct v4l2_edid32)  #define VIDIOC_TRY_FMT32      	_IOWR('V', 64, struct v4l2_format32)  #define VIDIOC_G_EXT_CTRLS32    _IOWR('V', 71, struct v4l2_ext_controls32)  #define VIDIOC_S_EXT_CTRLS32    _IOWR('V', 72, struct v4l2_ext_controls32) @@ -816,7 +818,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar  		struct v4l2_ext_controls v2ecs;  		struct v4l2_event v2ev;  		struct v4l2_create_buffers v2crt; -		struct v4l2_subdev_edid v2edid; +		struct v4l2_edid v2edid;  		unsigned long vx;  		int vi;  	} karg; @@ -849,8 +851,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar  	case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break;  	case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break;  	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_EDID32: cmd = VIDIOC_G_EDID; break; +	case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break;  	}  	switch (cmd) { @@ -868,9 +870,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar  		compatible_arg = 0;  		break; -	case VIDIOC_SUBDEV_G_EDID: -	case VIDIOC_SUBDEV_S_EDID: -		err = get_v4l2_subdev_edid32(&karg.v2edid, up); +	case VIDIOC_G_EDID: +	case VIDIOC_S_EDID: +		err = get_v4l2_edid32(&karg.v2edid, up);  		compatible_arg = 0;  		break; @@ -966,9 +968,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar  		err = put_v4l2_event32(&karg.v2ev, up);  		break; -	case VIDIOC_SUBDEV_G_EDID: -	case VIDIOC_SUBDEV_S_EDID: -		err = put_v4l2_subdev_edid32(&karg.v2edid, up); +	case VIDIOC_G_EDID: +	case VIDIOC_S_EDID: +		err = put_v4l2_edid32(&karg.v2edid, up);  		break;  	case VIDIOC_G_FMT: @@ -1006,103 +1008,14 @@ long v4l2_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)  	if (!file->f_op->unlocked_ioctl)  		return ret; -	switch (cmd) { -	case VIDIOC_QUERYCAP: -	case VIDIOC_RESERVED: -	case VIDIOC_ENUM_FMT: -	case VIDIOC_G_FMT32: -	case VIDIOC_S_FMT32: -	case VIDIOC_REQBUFS: -	case VIDIOC_QUERYBUF32: -	case VIDIOC_G_FBUF32: -	case VIDIOC_S_FBUF32: -	case VIDIOC_OVERLAY32: -	case VIDIOC_QBUF32: -	case VIDIOC_EXPBUF: -	case VIDIOC_DQBUF32: -	case VIDIOC_STREAMON32: -	case VIDIOC_STREAMOFF32: -	case VIDIOC_G_PARM: -	case VIDIOC_S_PARM: -	case VIDIOC_G_STD: -	case VIDIOC_S_STD: -	case VIDIOC_ENUMSTD32: -	case VIDIOC_ENUMINPUT32: -	case VIDIOC_G_CTRL: -	case VIDIOC_S_CTRL: -	case VIDIOC_G_TUNER: -	case VIDIOC_S_TUNER: -	case VIDIOC_G_AUDIO: -	case VIDIOC_S_AUDIO: -	case VIDIOC_QUERYCTRL: -	case VIDIOC_QUERYMENU: -	case VIDIOC_G_INPUT32: -	case VIDIOC_S_INPUT32: -	case VIDIOC_G_OUTPUT32: -	case VIDIOC_S_OUTPUT32: -	case VIDIOC_ENUMOUTPUT: -	case VIDIOC_G_AUDOUT: -	case VIDIOC_S_AUDOUT: -	case VIDIOC_G_MODULATOR: -	case VIDIOC_S_MODULATOR: -	case VIDIOC_S_FREQUENCY: -	case VIDIOC_G_FREQUENCY: -	case VIDIOC_CROPCAP: -	case VIDIOC_G_CROP: -	case VIDIOC_S_CROP: -	case VIDIOC_G_SELECTION: -	case VIDIOC_S_SELECTION: -	case VIDIOC_G_JPEGCOMP: -	case VIDIOC_S_JPEGCOMP: -	case VIDIOC_QUERYSTD: -	case VIDIOC_TRY_FMT32: -	case VIDIOC_ENUMAUDIO: -	case VIDIOC_ENUMAUDOUT: -	case VIDIOC_G_PRIORITY: -	case VIDIOC_S_PRIORITY: -	case VIDIOC_G_SLICED_VBI_CAP: -	case VIDIOC_LOG_STATUS: -	case VIDIOC_G_EXT_CTRLS32: -	case VIDIOC_S_EXT_CTRLS32: -	case VIDIOC_TRY_EXT_CTRLS32: -	case VIDIOC_ENUM_FRAMESIZES: -	case VIDIOC_ENUM_FRAMEINTERVALS: -	case VIDIOC_G_ENC_INDEX: -	case VIDIOC_ENCODER_CMD: -	case VIDIOC_TRY_ENCODER_CMD: -	case VIDIOC_DECODER_CMD: -	case VIDIOC_TRY_DECODER_CMD: -	case VIDIOC_DBG_S_REGISTER: -	case VIDIOC_DBG_G_REGISTER: -	case VIDIOC_S_HW_FREQ_SEEK: -	case VIDIOC_S_DV_TIMINGS: -	case VIDIOC_G_DV_TIMINGS: -	case VIDIOC_DQEVENT: -	case VIDIOC_DQEVENT32: -	case VIDIOC_SUBSCRIBE_EVENT: -	case VIDIOC_UNSUBSCRIBE_EVENT: -	case VIDIOC_CREATE_BUFS32: -	case VIDIOC_PREPARE_BUF32: -	case VIDIOC_ENUM_DV_TIMINGS: -	case VIDIOC_QUERY_DV_TIMINGS: -	case VIDIOC_DV_TIMINGS_CAP: -	case VIDIOC_ENUM_FREQ_BANDS: -	case VIDIOC_SUBDEV_G_EDID32: -	case VIDIOC_SUBDEV_S_EDID32: +	if (_IOC_TYPE(cmd) == 'V' && _IOC_NR(cmd) < BASE_VIDIOC_PRIVATE)  		ret = do_video_ioctl(file, cmd, arg); -		break; +	else if (vdev->fops->compat_ioctl32) +		ret = vdev->fops->compat_ioctl32(file, cmd, arg); -	default: -		if (vdev->fops->compat_ioctl32) -			ret = vdev->fops->compat_ioctl32(file, cmd, arg); - -		if (ret == -ENOIOCTLCMD) -			printk(KERN_WARNING "compat_ioctl32: " -				"unknown ioctl '%c', dir=%d, #%d (0x%08x)\n", -				_IOC_TYPE(cmd), _IOC_DIR(cmd), _IOC_NR(cmd), -				cmd); -		break; -	} +	if (ret == -ENOIOCTLCMD) +		pr_warn("compat_ioctl32: unknown ioctl '%c', dir=%d, #%d (0x%08x)\n", +			_IOC_TYPE(cmd), _IOC_DIR(cmd), _IOC_NR(cmd), cmd);  	return ret;  }  EXPORT_SYMBOL_GPL(v4l2_compat_ioctl32);  | 
