From: Liam Beguin <liambeguin@gmail.com>
To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org,
andy.shevchenko@gmail.com, lars@metafoo.de
Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
devicetree@vger.kernel.org, robh+dt@kernel.org
Subject: [PATCH v14 05/11] iio: afe: rescale: reduce risk of integer overflow
Date: Mon, 7 Feb 2022 21:04:35 -0500 [thread overview]
Message-ID: <20220208020441.3081162-6-liambeguin@gmail.com> (raw)
In-Reply-To: <20220208020441.3081162-1-liambeguin@gmail.com>
Reduce the risk of integer overflow by doing the scale calculation on
a 64-bit integer. Since the rescaling is only performed on *val, reuse
the IIO_VAL_FRACTIONAL_LOG2 case.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
drivers/iio/afe/iio-rescale.c | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 468e6c345bd1..67273de46843 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -25,21 +25,31 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
int *val, int *val2)
{
s64 tmp;
+ int _val, _val2;
s32 rem, rem2;
u32 mult;
u32 neg;
switch (scale_type) {
- case IIO_VAL_FRACTIONAL:
- *val *= rescale->numerator;
- *val2 *= rescale->denominator;
- return scale_type;
case IIO_VAL_INT:
*val *= rescale->numerator;
if (rescale->denominator == 1)
return scale_type;
*val2 = rescale->denominator;
return IIO_VAL_FRACTIONAL;
+ case IIO_VAL_FRACTIONAL:
+ /*
+ * When the product of both scales doesn't overflow, avoid
+ * potential accuracy loss (for in kernel consumers) by
+ * keeping a fractional representation.
+ */
+ if (!check_mul_overflow(*val, rescale->numerator, &_val) &&
+ !check_mul_overflow(*val2, rescale->denominator, &_val2)) {
+ *val = _val;
+ *val2 = _val2;
+ return IIO_VAL_FRACTIONAL;
+ }
+ fallthrough;
case IIO_VAL_FRACTIONAL_LOG2:
tmp = (s64)*val * 1000000000LL;
tmp = div_s64(tmp, rescale->denominator);
@@ -51,7 +61,10 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
if (!rem)
return scale_type;
- tmp = 1 << *val2;
+ if (scale_type == IIO_VAL_FRACTIONAL)
+ tmp = *val2;
+ else
+ tmp = ULL(1) << *val2;
rem2 = *val % (int)tmp;
*val = *val / (int)tmp;
--
2.35.1.4.g5d01301f2b86
next prev parent reply other threads:[~2022-02-08 2:09 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-08 2:04 [PATCH v14 00/11] iio: afe: add temperature rescaling support Liam Beguin
2022-02-08 2:04 ` [PATCH v14 01/11] iio: afe: rescale: expose scale processing function Liam Beguin
2022-02-08 2:04 ` [PATCH v14 02/11] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support Liam Beguin
2022-02-10 16:42 ` Peter Rosin
2022-02-10 17:36 ` Liam Beguin
2022-02-11 14:20 ` Peter Rosin
2022-02-08 2:04 ` [PATCH v14 03/11] iio: afe: rescale: add offset support Liam Beguin
2022-02-08 13:42 ` Andy Shevchenko
2022-02-09 16:35 ` Liam Beguin
2022-02-10 16:47 ` Peter Rosin
2022-02-08 2:04 ` [PATCH v14 04/11] iio: afe: rescale: fix accuracy for small fractional scales Liam Beguin
2022-02-08 2:04 ` Liam Beguin [this message]
2022-02-08 2:04 ` [PATCH v14 06/11] iio: afe: rescale: make use of units.h Liam Beguin
2022-02-10 17:41 ` Peter Rosin
2022-02-08 2:04 ` [PATCH v14 07/11] iio: test: add basic tests for the iio-rescale driver Liam Beguin
2022-02-08 12:15 ` kernel test robot
2022-02-08 2:04 ` [PATCH v14 08/11] iio: afe: rescale: add RTD temperature sensor support Liam Beguin
2022-02-08 2:04 ` [PATCH v14 09/11] iio: afe: rescale: add temperature transducers Liam Beguin
2022-02-08 13:46 ` Andy Shevchenko
2022-02-09 16:38 ` Liam Beguin
2022-02-08 2:04 ` [PATCH v14 10/11] dt-bindings: iio: afe: add bindings for temperature-sense-rtd Liam Beguin
2022-02-08 2:04 ` [PATCH v14 11/11] dt-bindings: iio: afe: add bindings for temperature transducers Liam Beguin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220208020441.3081162-6-liambeguin@gmail.com \
--to=liambeguin@gmail.com \
--cc=andy.shevchenko@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peda@axentia.se \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.