From patchwork Thu Feb 16 21:20:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 728911 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vPTcX4tqdz9s85 for ; Fri, 17 Feb 2017 08:21:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933485AbdBPVVq (ORCPT ); Thu, 16 Feb 2017 16:21:46 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:51957 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932975AbdBPVVp (ORCPT ); Thu, 16 Feb 2017 16:21:45 -0500 Received: from localhost.localdomain ([95.91.4.8]) by mrelayeu.kundenserver.de (mreue101 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MGiFl-1caMjh178j-00DXW0; Thu, 16 Feb 2017 22:20:56 +0100 From: Stefan Wahren To: Eric Anholt , Wolfram Sang , Peter Robinson Cc: Martin Sperl , =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= , Catalin Marinas , Will Deacon , Rob Herring , Frank Rowand , Florian Fainelli , linux-rpi-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-i2c@vger.kernel.org, Stefan Wahren Subject: [PATCH RFC 1/3] i2c: bcm2835: Avoid possible NULL ptr dereference Date: Thu, 16 Feb 2017 21:20:45 +0000 Message-Id: <1487280047-29608-2-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1487280047-29608-1-git-send-email-stefan.wahren@i2se.com> References: <1487280047-29608-1-git-send-email-stefan.wahren@i2se.com> MIME-Version: 1.0 X-Provags-ID: V03:K0:/T+oFTLGXA9oLn+QJuMj23QChqlgWqH0CkfZ4XBdzPkt54qIxDT /yDIaRZaNnd/eUgSknciiQi1cl4yjgk7DdQHCyXTvYybusB1e9V1tgHIELB3kKp1lc/TJeX 10QgqoTLrHLhcR76W4P3tM1LJl3cJt07UDarQiWM4bpchrHDjBppgGaTkcxp998bTiFkzyx ztEg4RMM2fh/AO8SLpj9Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:j9CUy7pUB58=:katf+WikWEHPJ3Gur4FMRv xb/k8AhVesvMT03X7Jpp+T8YpmyNMzmS4HRC+htDLzcF53dlpGgLOl9UP8bvaVmU2orrNkkBW KwHoa/V0tbsbocKjBNvDKNjfxdGMPVRWUAj0fnZHnqgRqHoNtXQ5HOhHNTbWXXoG6AeCj/P85 3TiLQ8DSfmLxMr7ZRwkSw9ClqC9zz0y+w1MonxYF13tgpHYdW2YaJachAC67gpZ/VgsJizbMy NlpOIgQtgSbbNQXtB8nWxsIdDvXMR0jBUx1kDBdyafBaz6QAiPyq7wp70h78gn0/TYSDMTxz1 0aQ4J6CWI3NjeY/eOQRkkOv7An7Gg+bXZcs6y3tKVdGhydpaj/9nbFrowu11sdb+CkpEDmplv Cjd4v5DTcaR3uvKm9TJ/9+vHH2kXbkHiVNQ+u9ShZnatiyk5MnEQM80/p22sZ6zExXbZiCvLh MTfcKhSqWM/QMV/T1pI4UwuTUFnZ/ZxXjEs2sxeIt4W3cH0ebNstQVL5sSOqjJpzKFK+mwr5m WUTEpbbPsjl45XW6e9Jtf9J6Qv2pzV+O/AIUzGXSTrlwyrsKhmA0DXd9aj52hWrdcS62WrOSa q529zQuvTFcdoAr09/BxNXMIwz8ncJ2GUtjHcJIm7iqksU7X0kxbsSrcmqkMscGaVfcqSqyuO v13klHIXCJDpFVVDl+B9xdDtzRWqA8vDu1uM7EttIG2DjbZb1FaUCiO0SlwlyJer0+Lzk3s31 dsg4DGqduIVG2xVN Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org 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 CC: Martin Sperl Reported-by: Peter Robinson Fixes: e2474541032d ("bcm2835: Fix hang for writing messages larger than 16 bytes") Signed-off-by: Stefan Wahren Acked-by: Noralf Trønnes --- 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); }