aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Wahren <stefan.wahren@i2se.com>2017-02-16 16:20:45 -0500
committerWolfram Sang <wsa@the-dreams.de>2017-02-20 13:19:54 -0500
commitababb08938df7ac245d30a58b95b94ecf8dc04fc (patch)
treed744a8bfbef3892fbd494beb7c879f5d2110cd19
parent0297ffa69cab614f508ef5d9abdb4c0ffd709795 (diff)
i2c: bcm2835: Avoid possible NULL ptr dereference
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>
-rw-r--r--drivers/i2c/busses/i2c-bcm2835.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
index c3436f627028..cd07a69e2e93 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)
195 } 195 }
196 196
197 if (val & BCM2835_I2C_S_DONE) { 197 if (val & BCM2835_I2C_S_DONE) {
198 if (i2c_dev->curr_msg->flags & I2C_M_RD) { 198 if (!i2c_dev->curr_msg) {
199 dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n");
200 } else if (i2c_dev->curr_msg->flags & I2C_M_RD) {
199 bcm2835_drain_rxfifo(i2c_dev); 201 bcm2835_drain_rxfifo(i2c_dev);
200 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); 202 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
201 } 203 }