Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (gl518sm) Fix overflows seen when writing into limit attributes

Writes into limit attributes can overflow due to additions and
multiplications with unchecked parameters.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>

+7 -6
+7 -6
drivers/hwmon/gl518sm.c
··· 86 86 #define BOOL_FROM_REG(val) ((val) ? 0 : 1) 87 87 #define BOOL_TO_REG(val) ((val) ? 0 : 1) 88 88 89 - #define TEMP_TO_REG(val) clamp_val(((((val) < 0 ? \ 90 - (val) - 500 : \ 91 - (val) + 500) / 1000) + 119), 0, 255) 89 + #define TEMP_CLAMP(val) clamp_val(val, -119000, 136000) 90 + #define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 119) 92 91 #define TEMP_FROM_REG(val) (((val) - 119) * 1000) 93 92 94 93 static inline u8 FAN_TO_REG(long rpm, int div) ··· 100 101 } 101 102 #define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) * (div)))) 102 103 103 - #define IN_TO_REG(val) clamp_val((((val) + 9) / 19), 0, 255) 104 + #define IN_CLAMP(val) clamp_val(val, 0, 255 * 19) 105 + #define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19) 104 106 #define IN_FROM_REG(val) ((val) * 19) 105 107 106 - #define VDD_TO_REG(val) clamp_val((((val) * 4 + 47) / 95), 0, 255) 107 - #define VDD_FROM_REG(val) (((val) * 95 + 2) / 4) 108 + #define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4) 109 + #define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95) 110 + #define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4) 108 111 109 112 #define DIV_FROM_REG(val) (1 << (val)) 110 113