[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <9e0e4398-873e-b5c0-0f0c-50a186ed2228@axentia.se>
Date: Fri, 23 Jul 2021 23:17:47 +0200
From: Peter Rosin <peda@...ntia.se>
To: Liam Beguin <liambeguin@...il.com>, jic23@...nel.org,
lars@...afoo.de, pmeerw@...erw.net
Cc: linux-kernel@...r.kernel.org, linux-iio@...r.kernel.org,
devicetree@...r.kernel.org, robh+dt@...nel.org
Subject: Re: [PATCH v6 08/13] iio: afe: rescale: reduce risk of integer
overflow
On 2021-07-21 05:06, Liam Beguin wrote:
> From: Liam Beguin <lvb@...hos.com>
>
> Reduce the risk of integer overflow by doing the scale calculation with
> 64bit integers and looking for a Greatest Common Divider for both parts
> of the fractional value when required.
>
> Signed-off-by: Liam Beguin <lvb@...hos.com>
> ---
> drivers/iio/afe/iio-rescale.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
> index 6f6a711ae3ae..35fa3b4e53e0 100644
> --- a/drivers/iio/afe/iio-rescale.c
> +++ b/drivers/iio/afe/iio-rescale.c
> @@ -21,12 +21,21 @@
> int rescale_process_scale(struct rescale *rescale, int scale_type,
> int *val, int *val2)
> {
> - unsigned long long tmp;
> + s64 tmp, tmp2;
> + u32 factor;
>
> switch (scale_type) {
> case IIO_VAL_FRACTIONAL:
> - *val *= rescale->numerator;
> - *val2 *= rescale->denominator;
> + if (check_mul_overflow(*val, rescale->numerator, (s32 *)&tmp) ||
> + check_mul_overflow(*val2, rescale->denominator, (s32 *)&tmp2)) {
> + tmp = (s64)*val * rescale->numerator;
> + tmp2 = (s64)*val2 * rescale->denominator;
> + factor = gcd(tmp, tmp2);
Hi!
Reiterating that gcd() only works for unsigned operands, so this is broken for
negative values.
Cheers,
Peter
> + tmp = div_s64(tmp, factor);
> + tmp2 = div_s64(tmp2, factor);
> + }
> + *val = tmp;
> + *val2 = tmp2;
> return scale_type;
> case IIO_VAL_INT:
> *val *= rescale->numerator;
>
Powered by blists - more mailing lists