When list_for_each_entry() completes the iteration over the whole list
without breaking the loop, the iterator value will be a bogus pointer
computed based on the head element.
While it is safe to use the pointer to determine if it was computed
based on the head element, either with list_entry_is_head() or
&pos->member == head, using the iterator variable after the loop should
be avoided.
In preparation to limiting the scope of a list iterator to the list
traversal loop, use a dedicated pointer to point to the found element [1].
Link: https://lore.kernel.org/all/YhdfEIwI4EdtHdym@kroah.com/
Signed-off-by: Jakob Koschel <jakobkoschel@gmail.com>
Link: https://lore.kernel.org/r/20220308171818.384491-22-jakobkoschel@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
        u16                             w_value = le16_to_cpu(ctrl->wValue);
        u16                             w_length = le16_to_cpu(ctrl->wLength);
        struct usb_function             *f = NULL;
+       struct usb_function             *iter;
        u8                              endp;
 
        if (w_length > USB_COMP_EP0_BUFSIZ) {
                        if (!cdev->config)
                                break;
                        endp = ((w_index & 0x80) >> 3) | (w_index & 0x0f);
-                       list_for_each_entry(f, &cdev->config->functions, list) {
-                               if (test_bit(endp, f->endpoints))
+                       list_for_each_entry(iter, &cdev->config->functions, list) {
+                               if (test_bit(endp, iter->endpoints)) {
+                                       f = iter;
                                        break;
+                               }
                        }
-                       if (&f->list == &cdev->config->functions)
-                               f = NULL;
                        break;
                }
 try_fun_setup: