mirror of https://gitee.com/openkylin/linux.git
[media] uvcvideo: Fix uvc_fixup_video_ctrl() format search
The scheme used to index format in uvc_fixup_video_ctrl() is not robust: format index is based on descriptor ordering, which does not necessarily match bFormatIndex ordering. Searching for first matching format will prevent uvc_fixup_video_ctrl() from using the wrong format/frame to make adjustments. Signed-off-by: Stephan Lachowsky <stephan.lachowsky@maxim-ic.com> Cc: stable@kernel.org Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
5db2c3ba4d
commit
38a66824d9
|
@ -89,15 +89,19 @@ int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
|
||||||
static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
|
static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
|
||||||
struct uvc_streaming_control *ctrl)
|
struct uvc_streaming_control *ctrl)
|
||||||
{
|
{
|
||||||
struct uvc_format *format;
|
struct uvc_format *format = NULL;
|
||||||
struct uvc_frame *frame = NULL;
|
struct uvc_frame *frame = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (ctrl->bFormatIndex <= 0 ||
|
for (i = 0; i < stream->nformats; ++i) {
|
||||||
ctrl->bFormatIndex > stream->nformats)
|
if (stream->format[i].index == ctrl->bFormatIndex) {
|
||||||
return;
|
format = &stream->format[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
format = &stream->format[ctrl->bFormatIndex - 1];
|
if (format == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 0; i < format->nframes; ++i) {
|
for (i = 0; i < format->nframes; ++i) {
|
||||||
if (format->frame[i].bFrameIndex == ctrl->bFrameIndex) {
|
if (format->frame[i].bFrameIndex == ctrl->bFrameIndex) {
|
||||||
|
|
Loading…
Reference in New Issue