diff mbox series

HID: Remove default case statement in fetch_item()

Message ID 20241015-hid-fix-fetch_item-unreachable-v1-1-b131cd10dbd1@kernel.org
State New
Headers show
Series HID: Remove default case statement in fetch_item() | expand

Commit Message

Nathan Chancellor Oct. 15, 2024, 7:23 p.m. UTC
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 <dmitry.torokhov@gmail.com>
Closes: https://lore.kernel.org/20241010222451.GA3571761@thelio-3990X/
Reported-by: Paul E. McKenney <paulmck@kernel.org>
Closes: https://lore.kernel.org/fe8c909e-bf02-4466-b3eb-0a4747df32e3@paulmck-laptop/
Tested-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
 drivers/hid/hid-core.c | 3 ---
 1 file changed, 3 deletions(-)


---
base-commit: af27f2c22f5e3dc61e787f1b1d9f4b3cddf4af25
change-id: 20241015-hid-fix-fetch_item-unreachable-9c05547c856d

Best regards,

Comments

Jiri Kosina Oct. 16, 2024, 8:17 a.m. UTC | #1
On Tue, 15 Oct 2024, Nathan Chancellor wrote:

> 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 <dmitry.torokhov@gmail.com>
> Closes: https://lore.kernel.org/20241010222451.GA3571761@thelio-3990X/
> Reported-by: Paul E. McKenney <paulmck@kernel.org>
> Closes: https://lore.kernel.org/fe8c909e-bf02-4466-b3eb-0a4747df32e3@paulmck-laptop/
> Tested-by: Paul E. McKenney <paulmck@kernel.org>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>

Applied, thanks.
diff mbox series

Patch

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 77725e33592098a0bd45222cfafc4b7c80daae54..3e3166d5719490afe88530d0e5aec3d63a96ed55 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -818,9 +818,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;