]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
HID: simplify code in fetch_item()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 1 Oct 2024 15:42:36 +0000 (08:42 -0700)
committerBenjamin Tissoires <bentiss@kernel.org>
Fri, 4 Oct 2024 08:36:39 +0000 (10:36 +0200)
We can easily calculate the size of the item using arithmetic (shifts).
This allows to pull duplicated code out of the switch statement, making
it cleaner.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Link: https://patch.msgid.link/ZvwYbESMZ667QZqY@google.com
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/hid/hid-core.c

index 30de92d0bf0f2f932edab57c1e81da2874a34f9c..0dc3018de2a6c6149e94f9363967cf4cbce49322 100644 (file)
@@ -754,35 +754,32 @@ static const u8 *fetch_item(const __u8 *start, const __u8 *end, struct hid_item
        }
 
        item->format = HID_ITEM_FORMAT_SHORT;
-       item->size = b & 3;
+       item->size = BIT(b & 3) >> 1; /* 0, 1, 2, 3 -> 0, 1, 2, 4 */
+
+       if (end - start < item->size)
+               return NULL;
 
        switch (item->size) {
        case 0:
-               return start;
+               break;
 
        case 1:
-               if ((end - start) < 1)
-                       return NULL;
-               item->data.u8 = *start++;
-               return start;
+               item->data.u8 = *start;
+               break;
 
        case 2:
-               if ((end - start) < 2)
-                       return NULL;
                item->data.u16 = get_unaligned_le16(start);
-               start = (__u8 *)((__le16 *)start + 1);
-               return start;
+               break;
 
-       case 3:
-               item->size++;
-               if ((end - start) < 4)
-                       return NULL;
+       case 4:
                item->data.u32 = get_unaligned_le32(start);
-               start = (__u8 *)((__le32 *)start + 1);
-               return start;
+               break;
+
+       default:
+               unreachable();
        }
 
-       return NULL;
+       return start + item->size;
 }
 
 static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)