Messages in this thread | | | From | "Sa, Nuno" <> | Subject | RE: [PATCH] iio: addac: ad74413r: fix integer promotion bug in ad74413_get_input_current_offset() | Date | Fri, 18 Nov 2022 13:17:29 +0000 |
| |
> From: Rasmus Villemoes <linux@rasmusvillemoes.dk> > Sent: Friday, November 18, 2022 1:32 PM > To: Tanislav, Cosmin <Cosmin.Tanislav@analog.com>; Lars-Peter Clausen > <lars@metafoo.de>; Hennerich, Michael <Michael.Hennerich@analog.com>; > Jonathan Cameron <jic23@kernel.org> > Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>; linux- > iio@vger.kernel.org; linux-kernel@vger.kernel.org > Subject: [PATCH] iio: addac: ad74413r: fix integer promotion bug in > ad74413_get_input_current_offset() > > [External] > > The constant AD74413R_ADC_RESULT_MAX is defined via GENMASK, so its > type is "unsigned long". > > Hence in the expression voltage_offset * AD74413R_ADC_RESULT_MAX, > voltage_offset is first promoted to unsigned long, and since it may be > negative, that results in a garbage value. For example, when range is > AD74413R_ADC_RANGE_5V_BI_DIR, voltage_offset is -2500 and > voltage_range is 5000, so the RHS of this assignment is, depending on > sizeof(long), either 826225UL or 3689348814709142UL, which after > truncation to int then results in either 826225 or 1972216214 being > the output from in_currentX_offset. > > Casting to int avoids that promotion and results in the correct -32767 > output. > > Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> > ---
After adding proper Fixes: tag,
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
| |