Message ID | 20241117114534.work.292-kees@kernel.org |
---|---|
State | New |
Headers | show |
Series | pinctrl: airoha: Use unsigned long for bit search | expand |
On Sun, Nov 17, 2024 at 12:45 PM Kees Cook <kees@kernel.org> wrote: > Instead of risking alignment problems and causing (false positive) array > bound warnings when casting a u32 to (64-bit) unsigned long, just use a > native unsigned long for doing bit searches. Avoids warning with GCC 15's > -Warray-bounds -fdiagnostics-details: > > In file included from ../include/linux/bitmap.h:11, > from ../include/linux/cpumask.h:12, > from ../arch/x86/include/asm/paravirt.h:21, > from ../arch/x86/include/asm/irqflags.h:80, > from ../include/linux/irqflags.h:18, > from ../include/linux/spinlock.h:59, > from ../include/linux/irq.h:14, > from ../include/linux/irqchip/chained_irq.h:10, > from ../include/linux/gpio/driver.h:8, > from ../drivers/pinctrl/mediatek/pinctrl-airoha.c:11: > In function 'find_next_bit', > inlined from 'airoha_irq_handler' at ../drivers/pinctrl/mediatek/pinctrl-airoha.c:2394:3: > ../include/linux/find.h:65:23: error: array subscript 'long unsigned int[0]' is partly outside array bounds of 'u32[1]' {aka 'unsigned int[1]'} [-Werror=array-bounds=] > 65 | val = *addr & GENMASK(size - 1, offset); > | ^~~~~ > ../drivers/pinctrl/mediatek/pinctrl-airoha.c: In function 'airoha_irq_handler': > ../drivers/pinctrl/mediatek/pinctrl-airoha.c:2387:21: note: object 'status' of size 4 > 2387 | u32 status; > | ^~~~~~ > > Signed-off-by: Kees Cook <kees@kernel.org> Patch applied, thanks Kees! Yours, Linus Walleij
diff --git a/drivers/pinctrl/mediatek/pinctrl-airoha.c b/drivers/pinctrl/mediatek/pinctrl-airoha.c index 7692e6d9b871..547a798b71c8 100644 --- a/drivers/pinctrl/mediatek/pinctrl-airoha.c +++ b/drivers/pinctrl/mediatek/pinctrl-airoha.c @@ -2384,15 +2384,16 @@ static irqreturn_t airoha_irq_handler(int irq, void *data) for (i = 0; i < ARRAY_SIZE(irq_status_regs); i++) { struct gpio_irq_chip *girq = &pinctrl->gpiochip.chip.irq; - u32 status; + u32 regmap; + unsigned long status; int irq; if (regmap_read(pinctrl->regmap, pinctrl->gpiochip.status[i], - &status)) + ®map)) continue; - for_each_set_bit(irq, (unsigned long *)&status, - AIROHA_PIN_BANK_SIZE) { + status = regmap; + for_each_set_bit(irq, &status, AIROHA_PIN_BANK_SIZE) { u32 offset = irq + i * AIROHA_PIN_BANK_SIZE; generic_handle_irq(irq_find_mapping(girq->domain,
Instead of risking alignment problems and causing (false positive) array bound warnings when casting a u32 to (64-bit) unsigned long, just use a native unsigned long for doing bit searches. Avoids warning with GCC 15's -Warray-bounds -fdiagnostics-details: In file included from ../include/linux/bitmap.h:11, from ../include/linux/cpumask.h:12, from ../arch/x86/include/asm/paravirt.h:21, from ../arch/x86/include/asm/irqflags.h:80, from ../include/linux/irqflags.h:18, from ../include/linux/spinlock.h:59, from ../include/linux/irq.h:14, from ../include/linux/irqchip/chained_irq.h:10, from ../include/linux/gpio/driver.h:8, from ../drivers/pinctrl/mediatek/pinctrl-airoha.c:11: In function 'find_next_bit', inlined from 'airoha_irq_handler' at ../drivers/pinctrl/mediatek/pinctrl-airoha.c:2394:3: ../include/linux/find.h:65:23: error: array subscript 'long unsigned int[0]' is partly outside array bounds of 'u32[1]' {aka 'unsigned int[1]'} [-Werror=array-bounds=] 65 | val = *addr & GENMASK(size - 1, offset); | ^~~~~ ../drivers/pinctrl/mediatek/pinctrl-airoha.c: In function 'airoha_irq_handler': ../drivers/pinctrl/mediatek/pinctrl-airoha.c:2387:21: note: object 'status' of size 4 2387 | u32 status; | ^~~~~~ Signed-off-by: Kees Cook <kees@kernel.org> --- Cc: Lorenzo Bianconi <lorenzo@kernel.org> Cc: Sean Wang <sean.wang@kernel.org> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: linux-mediatek@lists.infradead.org Cc: linux-gpio@vger.kernel.org --- drivers/pinctrl/mediatek/pinctrl-airoha.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)