]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: simplify snto32()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 3 Oct 2024 14:46:50 +0000 (07:46 -0700)
committerBenjamin Tissoires <bentiss@kernel.org>
Fri, 4 Oct 2024 08:37:09 +0000 (10:37 +0200)
snto32() does exactly what sign_extend32() does, but handles
potentially malformed data coming from the device. Keep the checks,
but then call sign_extend32() to perform the actual conversion.

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

index 0dc3018de2a6c6149e94f9363967cf4cbce49322..a6fe04e1c7268dd4ff655601d93dad1fb63375d3 100644 (file)
@@ -1313,9 +1313,7 @@ alloc_err:
 EXPORT_SYMBOL_GPL(hid_open_report);
 
 /*
- * Convert a signed n-bit integer to signed 32-bit integer. Common
- * cases are done through the compiler, the screwed things has to be
- * done by hand.
+ * Convert a signed n-bit integer to signed 32-bit integer.
  */
 
 static s32 snto32(__u32 value, unsigned n)
@@ -1326,12 +1324,7 @@ static s32 snto32(__u32 value, unsigned n)
        if (n > 32)
                n = 32;
 
-       switch (n) {
-       case 8:  return ((__s8)value);
-       case 16: return ((__s16)value);
-       case 32: return ((__s32)value);
-       }
-       return value & (1 << (n - 1)) ? value | (~0U << n) : value;
+       return sign_extend32(value, n - 1);
 }
 
 s32 hid_snto32(__u32 value, unsigned n)