| From 7263cf2f55935fb90e6cc5fe6c4dc3868c3cc8ae Mon Sep 17 00:00:00 2001 |
| From: Stefan Wahren <stefan.wahren@i2se.com> |
| Date: Thu, 16 Feb 2017 21:20:45 +0000 |
| Subject: i2c: bcm2835: Avoid possible NULL ptr dereference |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| [ Upstream commit ababb08938df7ac245d30a58b95b94ecf8dc04fc ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 f283b714aa79..7ed09865cb4b 100644 |
| --- a/drivers/i2c/busses/i2c-bcm2835.c |
| +++ b/drivers/i2c/busses/i2c-bcm2835.c |
| @@ -128,7 +128,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); |
| } |
| -- |
| 2.17.1 |
| |