Messages in this thread Patch in this message | | | Date | Wed, 14 Oct 2009 19:16:38 +0200 | From | Roel Kluin <> | Subject | Re: [PATCH] gpio: Fix test on unsigned in lnw_irq_type() |
| |
The wrong test was used, gpio is unsigned. Also lnw->chip.ngpio is set to 64, so if gpio equals that, then reg (= gpio / 32) becomes 2, an index out of bounds for GRER and GFER that have 2 elements.
Signed-off-by: Roel Kluin <roel.kluin@gmail.com> --- >>>> From: Andrew Morton [mailto:akpm@linux-foundation.org] >>>>> - if (gpio < 0 || gpio > lnw->chip.ngpio) >>>>> + if (gpio > lnw->chip.ngpio) >>>>> return -EINVAL; >>>> >>>> Should that be >= ?
> Oh, my bad. Andrew is right, should be >=...
Ok, how about this then?
diff --git a/drivers/gpio/langwell_gpio.c b/drivers/gpio/langwell_gpio.c index 5711ce5..72af3fc 100644 --- a/drivers/gpio/langwell_gpio.c +++ b/drivers/gpio/langwell_gpio.c @@ -123,7 +123,7 @@ static int lnw_irq_type(unsigned irq, unsigned type) void __iomem *grer = (void __iomem *)(&lnw->reg_base->GRER[reg]); void __iomem *gfer = (void __iomem *)(&lnw->reg_base->GFER[reg]); - if (gpio < 0 || gpio > lnw->chip.ngpio) + if (gpio >= lnw->chip.ngpio) return -EINVAL; spin_lock_irqsave(&lnw->lock, flags); if (type & IRQ_TYPE_EDGE_RISING)
| |