aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 260288ca4f55..f48c505550e0 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1273,6 +1273,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
1273 case V4L2_PIX_FMT_VC1_ANNEX_L: descr = "VC-1 (SMPTE 412M Annex L)"; break; 1273 case V4L2_PIX_FMT_VC1_ANNEX_L: descr = "VC-1 (SMPTE 412M Annex L)"; break;
1274 case V4L2_PIX_FMT_VP8: descr = "VP8"; break; 1274 case V4L2_PIX_FMT_VP8: descr = "VP8"; break;
1275 case V4L2_PIX_FMT_VP9: descr = "VP9"; break; 1275 case V4L2_PIX_FMT_VP9: descr = "VP9"; break;
1276 case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka H.265 */
1276 case V4L2_PIX_FMT_CPIA1: descr = "GSPCA CPiA YUV"; break; 1277 case V4L2_PIX_FMT_CPIA1: descr = "GSPCA CPiA YUV"; break;
1277 case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break; 1278 case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break;
1278 case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break; 1279 case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break;
@@ -2611,7 +2612,7 @@ static struct v4l2_ioctl_info v4l2_ioctls[] = {
2611 IOCTL_INFO_FNC(VIDIOC_PREPARE_BUF, v4l_prepare_buf, v4l_print_buffer, INFO_FL_QUEUE), 2612 IOCTL_INFO_FNC(VIDIOC_PREPARE_BUF, v4l_prepare_buf, v4l_print_buffer, INFO_FL_QUEUE),
2612 IOCTL_INFO_STD(VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings, v4l_print_enum_dv_timings, INFO_FL_CLEAR(v4l2_enum_dv_timings, pad)), 2613 IOCTL_INFO_STD(VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings, v4l_print_enum_dv_timings, INFO_FL_CLEAR(v4l2_enum_dv_timings, pad)),
2613 IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, INFO_FL_ALWAYS_COPY), 2614 IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, INFO_FL_ALWAYS_COPY),
2614 IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, INFO_FL_CLEAR(v4l2_dv_timings_cap, type)), 2615 IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, INFO_FL_CLEAR(v4l2_dv_timings_cap, pad)),
2615 IOCTL_INFO_FNC(VIDIOC_ENUM_FREQ_BANDS, v4l_enum_freq_bands, v4l_print_freq_band, 0), 2616 IOCTL_INFO_FNC(VIDIOC_ENUM_FREQ_BANDS, v4l_enum_freq_bands, v4l_print_freq_band, 0),
2616 IOCTL_INFO_FNC(VIDIOC_DBG_G_CHIP_INFO, v4l_dbg_g_chip_info, v4l_print_dbg_chip_info, INFO_FL_CLEAR(v4l2_dbg_chip_info, match)), 2617 IOCTL_INFO_FNC(VIDIOC_DBG_G_CHIP_INFO, v4l_dbg_g_chip_info, v4l_print_dbg_chip_info, INFO_FL_CLEAR(v4l2_dbg_chip_info, match)),
2617 IOCTL_INFO_FNC(VIDIOC_QUERY_EXT_CTRL, v4l_query_ext_ctrl, v4l_print_query_ext_ctrl, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_query_ext_ctrl, id)), 2618 IOCTL_INFO_FNC(VIDIOC_QUERY_EXT_CTRL, v4l_query_ext_ctrl, v4l_print_query_ext_ctrl, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_query_ext_ctrl, id)),
@@ -2832,14 +2833,15 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
2832 size_t array_size = 0; 2833 size_t array_size = 0;
2833 void __user *user_ptr = NULL; 2834 void __user *user_ptr = NULL;
2834 void **kernel_ptr = NULL; 2835 void **kernel_ptr = NULL;
2836 const size_t ioc_size = _IOC_SIZE(cmd);
2835 2837
2836 /* Copy arguments into temp kernel buffer */ 2838 /* Copy arguments into temp kernel buffer */
2837 if (_IOC_DIR(cmd) != _IOC_NONE) { 2839 if (_IOC_DIR(cmd) != _IOC_NONE) {
2838 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { 2840 if (ioc_size <= sizeof(sbuf)) {
2839 parg = sbuf; 2841 parg = sbuf;
2840 } else { 2842 } else {
2841 /* too big to allocate from stack */ 2843 /* too big to allocate from stack */
2842 mbuf = kvmalloc(_IOC_SIZE(cmd), GFP_KERNEL); 2844 mbuf = kvmalloc(ioc_size, GFP_KERNEL);
2843 if (NULL == mbuf) 2845 if (NULL == mbuf)
2844 return -ENOMEM; 2846 return -ENOMEM;
2845 parg = mbuf; 2847 parg = mbuf;
@@ -2847,7 +2849,7 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
2847 2849
2848 err = -EFAULT; 2850 err = -EFAULT;
2849 if (_IOC_DIR(cmd) & _IOC_WRITE) { 2851 if (_IOC_DIR(cmd) & _IOC_WRITE) {
2850 unsigned int n = _IOC_SIZE(cmd); 2852 unsigned int n = ioc_size;
2851 2853
2852 /* 2854 /*
2853 * In some cases, only a few fields are used as input, 2855 * In some cases, only a few fields are used as input,
@@ -2868,11 +2870,11 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
2868 goto out; 2870 goto out;
2869 2871
2870 /* zero out anything we don't copy from userspace */ 2872 /* zero out anything we don't copy from userspace */
2871 if (n < _IOC_SIZE(cmd)) 2873 if (n < ioc_size)
2872 memset((u8 *)parg + n, 0, _IOC_SIZE(cmd) - n); 2874 memset((u8 *)parg + n, 0, ioc_size - n);
2873 } else { 2875 } else {
2874 /* read-only ioctl */ 2876 /* read-only ioctl */
2875 memset(parg, 0, _IOC_SIZE(cmd)); 2877 memset(parg, 0, ioc_size);
2876 } 2878 }
2877 } 2879 }
2878 2880
@@ -2930,7 +2932,7 @@ out_array_args:
2930 switch (_IOC_DIR(cmd)) { 2932 switch (_IOC_DIR(cmd)) {
2931 case _IOC_READ: 2933 case _IOC_READ:
2932 case (_IOC_WRITE | _IOC_READ): 2934 case (_IOC_WRITE | _IOC_READ):
2933 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd))) 2935 if (copy_to_user((void __user *)arg, parg, ioc_size))
2934 err = -EFAULT; 2936 err = -EFAULT;
2935 break; 2937 break;
2936 } 2938 }