v4l2: Change to query only up to V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS
authorekwange <ekwange@gmail.com>
Tue, 30 May 2023 08:52:34 +0000 (17:52 +0900)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 13 Jun 2023 19:02:18 +0000 (20:02 +0100)
Fix to prevent infinite querying.
There are devices that exceed V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS
but do not return EINVAL.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4851>

subprojects/gst-plugins-good/sys/v4l2/v4l2_calls.c

index cb37ea7..6243d09 100644 (file)
@@ -307,6 +307,10 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object)
       } else {
         GST_WARNING_OBJECT (e, "Failed querying control %d on device '%s'. "
             "(%d - %s)", n, v4l2object->videodev, errno, strerror (errno));
+        if (n > (V4L2_CID_PRIVATE_BASE + V4L2_CID_MAX_CTRLS)) {
+          GST_DEBUG_OBJECT (e, "Finish control by reaching V4L2_CID_MAX_CTRLS");
+          break;
+        }
         continue;
       }
     }