> From: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> > Sent: Friday, November 18, 2022 1:32 PM > To: Tanislav, Cosmin <Cosmin.Tanislav@xxxxxxxxxx>; Lars-Peter Clausen > <lars@xxxxxxxxxx>; Hennerich, Michael <Michael.Hennerich@xxxxxxxxxx>; > Jonathan Cameron <jic23@xxxxxxxxxx> > Cc: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx>; linux- > iio@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxxxxx> > --- After adding proper Fixes: tag, Reviewed-by: Nuno Sá <nuno.sa@xxxxxxxxxx>