[PATCH RFC 1/3] i2c: bcm2835: Avoid possible NULL ptr dereference
Noralf Trønnes
noralf at tronnes.org
Sat Feb 18 10:34:10 PST 2017
Den 16.02.2017 22.20, skrev Stefan Wahren:
> Since commit e2474541032d ("bcm2835: Fix hang for writing messages
> larger than 16 bytes") the interrupt handler is prone to a possible
> NULL pointer dereference. This could happen if an interrupt fires
> before curr_msg is set by bcm2835_i2c_xfer_msg() and randomly occurs
> on the RPi 3. Even this is an unexpected behavior the driver must
> handle that with an error instead of a crash.
>
> CC: Noralf Trønnes <noralf at tronnes.org>
> CC: Martin Sperl <kernel at martin.sperl.org>
> Reported-by: Peter Robinson <pbrobinson at gmail.com>
> Fixes: e2474541032d ("bcm2835: Fix hang for writing messages larger than 16 bytes")
> Signed-off-by: Stefan Wahren <stefan.wahren at i2se.com>
> ---
> drivers/i2c/busses/i2c-bcm2835.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
> index c3436f6..10e39c8 100644
> --- a/drivers/i2c/busses/i2c-bcm2835.c
> +++ b/drivers/i2c/busses/i2c-bcm2835.c
> @@ -195,7 +195,9 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data)
> }
>
> if (val & BCM2835_I2C_S_DONE) {
> - if (i2c_dev->curr_msg->flags & I2C_M_RD) {
> + if (!i2c_dev->curr_msg) {
> + dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n");
> + } else if (i2c_dev->curr_msg->flags & I2C_M_RD) {
> bcm2835_drain_rxfifo(i2c_dev);
> val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
> }
Thanks,
Acked-by: Noralf Trønnes <noralf at tronnes.org>
More information about the linux-rpi-kernel
mailing list