media: uvcvideo: Constify formats, frames and intervals
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 20 Apr 2023 03:47:57 +0000 (06:47 +0300)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 13:11:55 +0000 (14:11 +0100)
The formats, frames and intervals stored in the uvc_streaming structure
are not meant to change after being parsed at probe time. Make them
const to prevent unintended modifications, and adapt the probe code
accordingly to use non-const pointers during parsing.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_v4l2.c
drivers/media/usb/uvc/uvc_video.c
drivers/media/usb/uvc/uvcvideo.h

index adfb0b08d1298956e7ed4fd374deb5ceeb7594e8..1f40f92b79b7b15d8d2152b259907296cc9d62bf 100644 (file)
@@ -221,7 +221,8 @@ static struct uvc_streaming *uvc_stream_new(struct uvc_device *dev,
 
 static int uvc_parse_format(struct uvc_device *dev,
        struct uvc_streaming *streaming, struct uvc_format *format,
-       u32 **intervals, unsigned char *buffer, int buflen)
+       struct uvc_frame *frames, u32 **intervals, unsigned char *buffer,
+       int buflen)
 {
        struct usb_interface *intf = streaming->intf;
        struct usb_host_interface *alts = intf->cur_altsetting;
@@ -235,6 +236,7 @@ static int uvc_parse_format(struct uvc_device *dev,
 
        format->type = buffer[2];
        format->index = buffer[3];
+       format->frames = frames;
 
        switch (buffer[2]) {
        case UVC_VS_FORMAT_UNCOMPRESSED:
@@ -339,8 +341,8 @@ static int uvc_parse_format(struct uvc_device *dev,
                ftype = 0;
 
                /* Create a dummy frame descriptor. */
-               frame = &format->frames[0];
-               memset(&format->frames[0], 0, sizeof(format->frames[0]));
+               frame = &frames[0];
+               memset(frame, 0, sizeof(*frame));
                frame->bFrameIntervalType = 1;
                frame->dwDefaultFrameInterval = 1;
                frame->dwFrameInterval = *intervals;
@@ -372,7 +374,7 @@ static int uvc_parse_format(struct uvc_device *dev,
               buffer[2] == ftype) {
                unsigned int maxIntervalIndex;
 
-               frame = &format->frames[format->nframes];
+               frame = &frames[format->nframes];
                if (ftype != UVC_VS_FRAME_FRAME_BASED)
                        n = buflen > 25 ? buffer[25] : 0;
                else
@@ -460,8 +462,7 @@ static int uvc_parse_format(struct uvc_device *dev,
                 */
                if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) {
                        frame->bFrameIntervalType = 1;
-                       frame->dwFrameInterval[0] =
-                               frame->dwDefaultFrameInterval;
+                       (*intervals)[0] = frame->dwDefaultFrameInterval;
                }
 
                uvc_dbg(dev, DESCR, "- %ux%u (%u.%u fps)\n",
@@ -706,8 +707,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
                case UVC_VS_FORMAT_MJPEG:
                case UVC_VS_FORMAT_DV:
                case UVC_VS_FORMAT_FRAME_BASED:
-                       format->frames = frame;
-                       ret = uvc_parse_format(dev, streaming, format,
+                       ret = uvc_parse_format(dev, streaming, format, frame,
                                &interval, buffer, buflen);
                        if (ret < 0)
                                goto error;
index e7261b2543cb021a70389999852f3175ae3593cc..5ac2a424b13df6c8e5e86264812094f399e35859 100644 (file)
@@ -161,7 +161,7 @@ free_map:
  * the Video Probe and Commit negotiation, but some hardware don't implement
  * that feature.
  */
-static u32 uvc_try_frame_interval(struct uvc_frame *frame, u32 interval)
+static u32 uvc_try_frame_interval(const struct uvc_frame *frame, u32 interval)
 {
        unsigned int i;
 
@@ -210,10 +210,11 @@ static u32 uvc_v4l2_get_bytesperline(const struct uvc_format *format,
 
 static int uvc_v4l2_try_format(struct uvc_streaming *stream,
        struct v4l2_format *fmt, struct uvc_streaming_control *probe,
-       struct uvc_format **uvc_format, struct uvc_frame **uvc_frame)
+       const struct uvc_format **uvc_format,
+       const struct uvc_frame **uvc_frame)
 {
-       struct uvc_format *format = NULL;
-       struct uvc_frame *frame = NULL;
+       const struct uvc_format *format = NULL;
+       const struct uvc_frame *frame = NULL;
        u16 rw, rh;
        unsigned int d, maxd;
        unsigned int i;
@@ -363,8 +364,8 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream,
 static int uvc_v4l2_get_format(struct uvc_streaming *stream,
        struct v4l2_format *fmt)
 {
-       struct uvc_format *format;
-       struct uvc_frame *frame;
+       const struct uvc_format *format;
+       const struct uvc_frame *frame;
        int ret = 0;
 
        if (fmt->type != stream->type)
@@ -398,8 +399,8 @@ static int uvc_v4l2_set_format(struct uvc_streaming *stream,
        struct v4l2_format *fmt)
 {
        struct uvc_streaming_control probe;
-       struct uvc_format *format;
-       struct uvc_frame *frame;
+       const struct uvc_format *format;
+       const struct uvc_frame *frame;
        int ret;
 
        if (fmt->type != stream->type)
@@ -465,8 +466,8 @@ static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream,
 {
        struct uvc_streaming_control probe;
        struct v4l2_fract timeperframe;
-       struct uvc_format *format;
-       struct uvc_frame *frame;
+       const struct uvc_format *format;
+       const struct uvc_frame *frame;
        u32 interval, maxd;
        unsigned int i;
        int ret;
@@ -697,7 +698,7 @@ static int uvc_ioctl_querycap(struct file *file, void *fh,
 static int uvc_ioctl_enum_fmt(struct uvc_streaming *stream,
                              struct v4l2_fmtdesc *fmt)
 {
-       struct uvc_format *format;
+       const struct uvc_format *format;
        enum v4l2_buf_type type = fmt->type;
        u32 index = fmt->index;
 
@@ -1249,8 +1250,8 @@ static int uvc_ioctl_enum_framesizes(struct file *file, void *fh,
 {
        struct uvc_fh *handle = fh;
        struct uvc_streaming *stream = handle->stream;
-       struct uvc_format *format = NULL;
-       struct uvc_frame *frame = NULL;
+       const struct uvc_format *format = NULL;
+       const struct uvc_frame *frame = NULL;
        unsigned int index;
        unsigned int i;
 
@@ -1289,8 +1290,8 @@ static int uvc_ioctl_enum_frameintervals(struct file *file, void *fh,
 {
        struct uvc_fh *handle = fh;
        struct uvc_streaming *stream = handle->stream;
-       struct uvc_format *format = NULL;
-       struct uvc_frame *frame = NULL;
+       const struct uvc_format *format = NULL;
+       const struct uvc_frame *frame = NULL;
        unsigned int nintervals;
        unsigned int index;
        unsigned int i;
index 34c781b7dee204836e3d735ac4665a46eb9094cd..28dde08ec6c5d9d595ceb559437617637fb3e86b 100644 (file)
@@ -137,8 +137,8 @@ static const struct usb_device_id elgato_cam_link_4k = {
 static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
        struct uvc_streaming_control *ctrl)
 {
-       struct uvc_format *format = NULL;
-       struct uvc_frame *frame = NULL;
+       const struct uvc_format *format = NULL;
+       const struct uvc_frame *frame = NULL;
        unsigned int i;
 
        /*
@@ -2100,8 +2100,8 @@ int uvc_video_resume(struct uvc_streaming *stream, int reset)
 int uvc_video_init(struct uvc_streaming *stream)
 {
        struct uvc_streaming_control *probe = &stream->ctrl;
-       struct uvc_format *format = NULL;
-       struct uvc_frame *frame = NULL;
+       const struct uvc_format *format = NULL;
+       const struct uvc_frame *frame = NULL;
        struct uvc_urb *uvc_urb;
        unsigned int i;
        int ret;
index bb077363717127c21ca8f6553be648798b744dd9..6fb0a78b1b0097129ef723f7826013c85aa3c2cb 100644 (file)
@@ -251,7 +251,7 @@ struct uvc_frame {
        u32 dwMaxVideoFrameBufferSize;
        u8  bFrameIntervalType;
        u32 dwDefaultFrameInterval;
-       u32 *dwFrameInterval;
+       const u32 *dwFrameInterval;
 };
 
 struct uvc_format {
@@ -265,7 +265,7 @@ struct uvc_format {
        u32 flags;
 
        unsigned int nframes;
-       struct uvc_frame *frames;
+       const struct uvc_frame *frames;
 };
 
 struct uvc_streaming_header {
@@ -438,12 +438,12 @@ struct uvc_streaming {
        enum v4l2_buf_type type;
 
        unsigned int nformats;
-       struct uvc_format *formats;
+       const struct uvc_format *formats;
 
        struct uvc_streaming_control ctrl;
-       struct uvc_format *def_format;
-       struct uvc_format *cur_format;
-       struct uvc_frame *cur_frame;
+       const struct uvc_format *def_format;
+       const struct uvc_format *cur_format;
+       const struct uvc_frame *cur_frame;
 
        /*
         * Protect access to ctrl, cur_format, cur_frame and hardware video