]> Git Repo - linux.git/commitdiff
HID: Remove default case statement in fetch_item()
authorNathan Chancellor <[email protected]>
Tue, 15 Oct 2024 19:23:47 +0000 (12:23 -0700)
committerJiri Kosina <[email protected]>
Wed, 16 Oct 2024 08:15:50 +0000 (10:15 +0200)
A default case statement with a bare unreachable() was recently added to
fetch_item(), which by itself introduces undefined behavior. objtool
points this out with a few different warnings, depending on
configuration and compiler:

  vmlinux.o: warning: objtool: fetch_item() falls through to next function ...

  vmlinux.o: warning: objtool: hid_open_report() falls through to next function hid_parser_main()
  vmlinux.o: warning: objtool: hid_scan_report() falls through to next function hid_allocate_device()

  vmlinux.o: warning: objtool: hid_open_report+0x21b: can't find jump dest instruction at .text.hid_open_report+0x40f

Replacing unreachable() with BUG() is a typical fix to eliminate the
undefined behavior and make the default case well defined. However, in
this case, all possible values are enumerated in the switch statement,
so the default case can never actually happen, as proven with the
comment next to the item->size assignment. Just remove the default case
altogether, as the return statement would still be valid if the switch
statement were ever to be skipped.

Fixes: 61595012f280 ("HID: simplify code in fetch_item()")
Suggested-by: Dmitry Torokhov <[email protected]>
Closes: https://lore.kernel.org/20241010222451.GA3571761@thelio-3990X/
Reported-by: Paul E. McKenney <[email protected]>
Closes: https://lore.kernel.org/fe8c909e-bf02-4466-b3eb-0a4747df32e3@paulmck-laptop/
Tested-by: Paul E. McKenney <[email protected]>
Signed-off-by: Nathan Chancellor <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
drivers/hid/hid-core.c

index 87b2cdd7f0c404af8fbdc5d620d8805569e4299c..bdd19bce11ebdb729c592d4c3b6715fc161a3db0 100644 (file)
@@ -802,9 +802,6 @@ static const u8 *fetch_item(const __u8 *start, const __u8 *end, struct hid_item
        case 4:
                item->data.u32 = get_unaligned_le32(start);
                break;
-
-       default:
-               unreachable();
        }
 
        return start + item->size;
This page took 0.061932 seconds and 4 git commands to generate.