Skip to content

Commit fdd478c

Browse files
vamoiridjic23
authored andcommitted
iio: chemical: bme680: Fix overflows in compensate() functions
There are cases in the compensate functions of the driver that there could be overflows of variables due to bit shifting ops. These implications were initially discussed here [1] and they were mentioned in log message of Commit 1b3bd85 ("iio: chemical: Add support for Bosch BME680 sensor"). [1]: https://lore.kernel.org/linux-iio/20180728114028.3c1bbe81@archlinux/ Fixes: 1b3bd85 ("iio: chemical: Add support for Bosch BME680 sensor") Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com> Link: https://lore.kernel.org/r/20240606212313.207550-4-vassilisamir@gmail.com Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent b47c0fe commit fdd478c

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

drivers/iio/chemical/bme680_core.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
342342
if (!calib->par_t2)
343343
bme680_read_calib(data, calib);
344344

345-
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
345+
var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
346346
var2 = (var1 * calib->par_t2) >> 11;
347347
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
348-
var3 = (var3 * (calib->par_t3 << 4)) >> 14;
348+
var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
349349
data->t_fine = var2 + var3;
350350
calc_temp = (data->t_fine * 5 + 128) >> 8;
351351

@@ -368,9 +368,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
368368
var1 = (data->t_fine >> 1) - 64000;
369369
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
370370
var2 = var2 + (var1 * calib->par_p5 << 1);
371-
var2 = (var2 >> 2) + (calib->par_p4 << 16);
371+
var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
372372
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
373-
(calib->par_p3 << 5)) >> 3) +
373+
((s32)calib->par_p3 << 5)) >> 3) +
374374
((calib->par_p2 * var1) >> 1);
375375
var1 = var1 >> 18;
376376
var1 = ((32768 + var1) * calib->par_p1) >> 15;
@@ -388,7 +388,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
388388
var3 = ((press_comp >> 8) * (press_comp >> 8) *
389389
(press_comp >> 8) * calib->par_p10) >> 17;
390390

391-
press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
391+
press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;
392392

393393
return press_comp;
394394
}
@@ -414,7 +414,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
414414
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
415415
>> 6) / 100) + (1 << 14))) >> 10;
416416
var3 = var1 * var2;
417-
var4 = calib->par_h6 << 7;
417+
var4 = (s32)calib->par_h6 << 7;
418418
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
419419
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
420420
var6 = (var4 * var5) >> 1;

0 commit comments

Comments
 (0)