]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
media: v4l2-ctrls-core.c: Do not use iterator outside loop
authorRicardo Ribalda <ribalda@chromium.org>
Wed, 10 Apr 2024 21:54:41 +0000 (21:54 +0000)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Mon, 15 Apr 2024 11:42:39 +0000 (13:42 +0200)
Simplify a bit the code introducing a new variable for iterating through
the control list.

It also makes smatch happy:

drivers/media/v4l2-core/v4l2-ctrls-api.c:1091 v4l2_query_ext_ctrl() warn: iterator used outside loop: 'ref'

Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
[hverkuil: fix tiny whitespace issue in 'pos  = ref': use just one space]

drivers/media/v4l2-core/v4l2-ctrls-api.c

index d9a422017bd9d05bb0f8c74a4bc0cb7210316bf3..e5a364efd5e668b4f4fe33ea83c0b738e5c3ec62 100644 (file)
@@ -1052,35 +1052,40 @@ int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctr
                if (id >= node2id(hdl->ctrl_refs.prev)) {
                        ref = NULL; /* Yes, so there is no next control */
                } else if (ref) {
+                       struct v4l2_ctrl_ref *pos = ref;
+
                        /*
                         * We found a control with the given ID, so just get
                         * the next valid one in the list.
                         */
-                       list_for_each_entry_continue(ref, &hdl->ctrl_refs, node) {
-                               is_compound = ref->ctrl->is_array ||
-                                       ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
-                               if (id < ref->ctrl->id &&
-                                   (is_compound & mask) == match)
+                       ref = NULL;
+                       list_for_each_entry_continue(pos, &hdl->ctrl_refs, node) {
+                               is_compound = pos->ctrl->is_array ||
+                                       pos->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
+                               if (id < pos->ctrl->id &&
+                                   (is_compound & mask) == match) {
+                                       ref = pos;
                                        break;
+                               }
                        }
-                       if (&ref->node == &hdl->ctrl_refs)
-                               ref = NULL;
                } else {
+                       struct v4l2_ctrl_ref *pos;
+
                        /*
                         * No control with the given ID exists, so start
                         * searching for the next largest ID. We know there
                         * is one, otherwise the first 'if' above would have
                         * been true.
                         */
-                       list_for_each_entry(ref, &hdl->ctrl_refs, node) {
-                               is_compound = ref->ctrl->is_array ||
-                                       ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
-                               if (id < ref->ctrl->id &&
-                                   (is_compound & mask) == match)
+                       list_for_each_entry(pos, &hdl->ctrl_refs, node) {
+                               is_compound = pos->ctrl->is_array ||
+                                       pos->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
+                               if (id < pos->ctrl->id &&
+                                   (is_compound & mask) == match) {
+                                       ref = pos;
                                        break;
+                               }
                        }
-                       if (&ref->node == &hdl->ctrl_refs)
-                               ref = NULL;
                }
        }
        mutex_unlock(hdl->lock);