Hi Laurent On Sat, 6 May 2023 at 09:14, Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> wrote: > > The intervals pointer is incremented for each interval when parsing the > format descriptor. This doesn't cause any issue as such, but gets in the > way of constifying some pointers. Modify the parsing code to index the > intervals pointer as an array and increment it in one go at end of > parsing. > > Careful readers will notice that the maxIntervalIndex variable is set to > 1 instead of n - 2 when bFrameIntervalType has a zero value. This is > functionally equivalent, as n is equal to 3 in that case. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> Reviewed-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > --- > drivers/media/usb/uvc/uvc_driver.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c > index 446bd8ff128c..11e4fa007f3f 100644 > --- a/drivers/media/usb/uvc/uvc_driver.c > +++ b/drivers/media/usb/uvc/uvc_driver.c > @@ -370,6 +370,8 @@ static int uvc_parse_format(struct uvc_device *dev, > */ > while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && > buffer[2] == ftype) { > + unsigned int maxIntervalIndex; > + > frame = &format->frames[format->nframes]; > if (ftype != UVC_VS_FRAME_FRAME_BASED) > n = buflen > 25 ? buffer[25] : 0; > @@ -418,7 +420,7 @@ static int uvc_parse_format(struct uvc_device *dev, > > for (i = 0; i < n; ++i) { > interval = get_unaligned_le32(&buffer[26+4*i]); > - *(*intervals)++ = interval ? interval : 1; > + (*intervals)[i] = interval ? interval : 1; > } > > /* > @@ -440,11 +442,11 @@ static int uvc_parse_format(struct uvc_device *dev, > * frame->wWidth * frame->wHeight / 8; > > /* Clamp the default frame interval to the boundaries. */ > - n -= frame->bFrameIntervalType ? 1 : 2; > + maxIntervalIndex = frame->bFrameIntervalType ? n - 1 : 1; Maybe it is worth mentioning that bFrameIntervalType == 0 is a continuous interval. idex 0 is min and 1 is max. > frame->dwDefaultFrameInterval = > clamp(frame->dwDefaultFrameInterval, > frame->dwFrameInterval[0], > - frame->dwFrameInterval[n]); > + frame->dwFrameInterval[maxIntervalIndex]); > > /* > * Some devices report frame intervals that are not functional. > @@ -463,6 +465,8 @@ static int uvc_parse_format(struct uvc_device *dev, > (100000000 / frame->dwDefaultFrameInterval) % 10); > > format->nframes++; > + *intervals += n; > + > buflen -= buffer[0]; > buffer += buffer[0]; > } > -- > Regards, > > Laurent Pinchart > -- Ricardo Ribalda