Message ID | 20250130090030.53422-1-a.vatoropin@crpt.ru |
---|---|
State | New |
Headers | show |
Series | power: supply: da9150-fg: fix potential overflow | expand |
On Thu, 30 Jan 2025 09:00:34 +0000, Ваторопин Андрей wrote: > Size of variable sd_gain equals four bytes - DA9150_QIF_SD_GAIN_SIZE. > Size of variable shunt_val equals two bytes - DA9150_QIF_SHUNT_VAL_SIZE. > > The expression sd_gain * shunt_val is currently being evaluated using > 32-bit arithmetic. So during the multiplication an overflow may occur. > > As the value of type 'u64' is used as storage for the eventual result, put > ULL variable at the first position of each expression in order to give the > compiler complete information about the proper arithmetic to use. According > to C99 the guaranteed width for a variable of type 'unsigned long long' >= > 64 bits. > > [...] Applied, thanks! [1/1] power: supply: da9150-fg: fix potential overflow commit: 3fb3cb4350befc4f901c54e0cb4a2a47b1302e08 Best regards,
diff --git a/drivers/power/supply/da9150-fg.c b/drivers/power/supply/da9150-fg.c index 652c1f213af1..63bec706167c 100644 --- a/drivers/power/supply/da9150-fg.c +++ b/drivers/power/supply/da9150-fg.c @@ -247,7 +247,7 @@ static int da9150_fg_current_avg(struct da9150_fg *fg, DA9150_QIF_SD_GAIN_SIZE); da9150_fg_read_sync_end(fg); - div = (u64) (sd_gain * shunt_val * 65536ULL); + div = 65536ULL * sd_gain * shunt_val; do_div(div, 1000000); - res = (u64) (iavg * 1000000ULL); + res = 1000000ULL * iavg; do_div(res, div);