]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: imu: bmi160: Remove potential undefined behavior in bmi160_config_pin()
authorJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 10 Mar 2026 03:45:45 +0000 (20:45 -0700)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 15 Mar 2026 12:20:34 +0000 (12:20 +0000)
If 'pin' is not one of its expected values, the value of
'int_out_ctrl_shift' is undefined.  With UBSAN enabled, this causes
Clang to generate undefined behavior, resulting in the following
warning:

  drivers/iio/imu/bmi160/bmi160_core.o: warning: objtool: bmi160_setup_irq() falls through to next function __cfi_bmi160_core_runtime_resume()

Prevent the UB and improve error handling by returning an error if 'pin'
has an unexpected value.

While at it, simplify the code a bit by moving the 'pin_name' assignment
to the first switch statement.

Fixes: 895bf81e6bbf ("iio:bmi160: add drdy interrupt support")
Reported-by: Arnd Bergmann <arnd@arndb.de>
Closes: https://lore.kernel.org/a426d669-58bb-4be1-9eaa-6f3d83109e2d@app.fastmail.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/bmi160/bmi160_core.c

index 5f47708b4c5dc5b2eb139b1c36542aae22a4cf43..4abb83b75e2e87a7d83b2505d164cbd96ddad30b 100644 (file)
@@ -573,12 +573,16 @@ static int bmi160_config_pin(struct regmap *regmap, enum bmi160_int_pin pin,
                int_out_ctrl_shift = BMI160_INT1_OUT_CTRL_SHIFT;
                int_latch_mask = BMI160_INT1_LATCH_MASK;
                int_map_mask = BMI160_INT1_MAP_DRDY_EN;
+               pin_name = "INT1";
                break;
        case BMI160_PIN_INT2:
                int_out_ctrl_shift = BMI160_INT2_OUT_CTRL_SHIFT;
                int_latch_mask = BMI160_INT2_LATCH_MASK;
                int_map_mask = BMI160_INT2_MAP_DRDY_EN;
+               pin_name = "INT2";
                break;
+       default:
+               return -EINVAL;
        }
        int_out_ctrl_mask = BMI160_INT_OUT_CTRL_MASK << int_out_ctrl_shift;
 
@@ -612,17 +616,8 @@ static int bmi160_config_pin(struct regmap *regmap, enum bmi160_int_pin pin,
        ret = bmi160_write_conf_reg(regmap, BMI160_REG_INT_MAP,
                                    int_map_mask, int_map_mask,
                                    write_usleep);
-       if (ret) {
-               switch (pin) {
-               case BMI160_PIN_INT1:
-                       pin_name = "INT1";
-                       break;
-               case BMI160_PIN_INT2:
-                       pin_name = "INT2";
-                       break;
-               }
+       if (ret)
                dev_err(dev, "Failed to configure %s IRQ pin", pin_name);
-       }
 
        return ret;
 }