]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: chemical: bme680: Fix overflows in compensate() functions
authorVasileios Amoiridis <vassilisamir@gmail.com>
Thu, 6 Jun 2024 21:22:55 +0000 (23:22 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:33:57 +0000 (09:33 +0200)
commit fdd478c3ae98c3f13628e110dce9b6cfb0d9b3c8 upstream.

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 1b3bd8592780 ("iio:
chemical: Add support for Bosch BME680 sensor").

[1]: https://lore.kernel.org/linux-iio/20180728114028.3c1bbe81@archlinux/

Fixes: 1b3bd8592780 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/iio/chemical/bme680_core.c

index 812829841733bdbd69b062c8b59beb8341e676ba..5db48f6d646c1d9ed8e3f006db064c15873a31ca 100644 (file)
@@ -342,10 +342,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
        if (!calib->par_t2)
                bme680_read_calib(data, calib);
 
-       var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
+       var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
        var2 = (var1 * calib->par_t2) >> 11;
        var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
-       var3 = (var3 * (calib->par_t3 << 4)) >> 14;
+       var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
        data->t_fine = var2 + var3;
        calc_temp = (data->t_fine * 5 + 128) >> 8;
 
@@ -368,9 +368,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
        var1 = (data->t_fine >> 1) - 64000;
        var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
        var2 = var2 + (var1 * calib->par_p5 << 1);
-       var2 = (var2 >> 2) + (calib->par_p4 << 16);
+       var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
        var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
-                       (calib->par_p3 << 5)) >> 3) +
+                       ((s32)calib->par_p3 << 5)) >> 3) +
                        ((calib->par_p2 * var1) >> 1);
        var1 = var1 >> 18;
        var1 = ((32768 + var1) * calib->par_p1) >> 15;
@@ -388,7 +388,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
        var3 = ((press_comp >> 8) * (press_comp >> 8) *
                        (press_comp >> 8) * calib->par_p10) >> 17;
 
-       press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
+       press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;
 
        return press_comp;
 }
@@ -414,7 +414,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
                 (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
                   >> 6) / 100) + (1 << 14))) >> 10;
        var3 = var1 * var2;
-       var4 = calib->par_h6 << 7;
+       var4 = (s32)calib->par_h6 << 7;
        var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
        var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
        var6 = (var4 * var5) >> 1;