| From dd354a95f4041f2d2873bcccdf11ef6c1b82003a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 15 Jan 2025 09:12:06 -0800 |
| Subject: mfd: sm501: Switch to BIT() to mitigate integer overflows |
| |
| From: Nikita Zhandarovich <n.zhandarovich@fintech.ru> |
| |
| [ Upstream commit 2d8cb9ffe18c2f1e5bd07a19cbce85b26c1d0cf0 ] |
| |
| If offset end up being high enough, right hand expression in functions |
| like sm501_gpio_set() shifted left for that number of bits, may |
| not fit in int type. |
| |
| Just in case, fix that by using BIT() both as an option safe from |
| overflow issues and to make this step look similar to other gpio |
| drivers. |
| |
| Found by Linux Verification Center (linuxtesting.org) with static |
| analysis tool SVACE. |
| |
| Fixes: f61be273d369 ("sm501: add gpiolib support") |
| Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru> |
| Link: https://lore.kernel.org/r/20250115171206.20308-1-n.zhandarovich@fintech.ru |
| Signed-off-by: Lee Jones <lee@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mfd/sm501.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c |
| index 28027982cf693..509dcb226cbfb 100644 |
| --- a/drivers/mfd/sm501.c |
| +++ b/drivers/mfd/sm501.c |
| @@ -920,7 +920,7 @@ static void sm501_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
| { |
| struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); |
| struct sm501_gpio *smgpio = smchip->ourgpio; |
| - unsigned long bit = 1 << offset; |
| + unsigned long bit = BIT(offset); |
| void __iomem *regs = smchip->regbase; |
| unsigned long save; |
| unsigned long val; |
| @@ -946,7 +946,7 @@ static int sm501_gpio_input(struct gpio_chip *chip, unsigned offset) |
| struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); |
| struct sm501_gpio *smgpio = smchip->ourgpio; |
| void __iomem *regs = smchip->regbase; |
| - unsigned long bit = 1 << offset; |
| + unsigned long bit = BIT(offset); |
| unsigned long save; |
| unsigned long ddr; |
| |
| @@ -971,7 +971,7 @@ static int sm501_gpio_output(struct gpio_chip *chip, |
| { |
| struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); |
| struct sm501_gpio *smgpio = smchip->ourgpio; |
| - unsigned long bit = 1 << offset; |
| + unsigned long bit = BIT(offset); |
| void __iomem *regs = smchip->regbase; |
| unsigned long save; |
| unsigned long val; |
| -- |
| 2.39.5 |
| |