]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
i2c: bcm2835: Avoid possible NULL ptr dereference
authorStefan Wahren <stefan.wahren@i2se.com>
Thu, 16 Feb 2017 21:20:45 +0000 (21:20 +0000)
committerWolfram Sang <wsa@the-dreams.de>
Mon, 20 Feb 2017 18:19:54 +0000 (19:19 +0100)
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.

Reported-by: Peter Robinson <pbrobinson@gmail.com>
Fixes: e2474541032d ("bcm2835: Fix hang for writing messages larger than 16 bytes")
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-bcm2835.c

index c3436f627028477f7e21b47e079fd5ab06ec188a..cd07a69e2e9355540442785f95e90823b05c9d10 100644 (file)
@@ -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);
                }