From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Wolfram Sang <wsa@the-dreams.de>, Sasha Levin <sashal@kernel.org>,
linux-i2c@vger.kernel.org
Subject: [PATCH AUTOSEL 4.14 25/27] i2c: bcm2835: Clear current buffer pointers and counts after a transfer
Date: Mon, 11 Mar 2019 15:58:22 -0400 [thread overview]
Message-ID: <20190311195824.139043-25-sashal@kernel.org> (raw)
In-Reply-To: <20190311195824.139043-1-sashal@kernel.org>
From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
[ Upstream commit f275a4659484716259cc46268d9043424e51cf0f ]
The driver's interrupt handler checks whether a message is currently
being handled with the curr_msg pointer. When it is NULL, the interrupt
is considered to be unexpected. Similarly, the i2c_start_transfer
routine checks for the remaining number of messages to handle in
num_msgs.
However, these values are never cleared and always keep the message and
number relevant to the latest transfer (which might be done already and
the underlying message memory might have been freed).
When an unexpected interrupt hits with the DONE bit set, the isr will
then try to access the flags field of the curr_msg structure, leading
to a fatal page fault.
The msg_buf and msg_buf_remaining fields are also never cleared at the
end of the transfer, which can lead to similar pitfalls.
Fix these issues by introducing a cleanup function and always calling
it after a transfer is finished.
Fixes: e2474541032d ("i2c: bcm2835: Fix hang for writing messages larger than 16 bytes")
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/i2c/busses/i2c-bcm2835.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
index 44deae78913e..4d19254f78c8 100644
--- a/drivers/i2c/busses/i2c-bcm2835.c
+++ b/drivers/i2c/busses/i2c-bcm2835.c
@@ -191,6 +191,15 @@ static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev)
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
}
+static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev)
+{
+ i2c_dev->curr_msg = NULL;
+ i2c_dev->num_msgs = 0;
+
+ i2c_dev->msg_buf = NULL;
+ i2c_dev->msg_buf_remaining = 0;
+}
+
/*
* Note about I2C_C_CLEAR on error:
* The I2C_C_CLEAR on errors will take some time to resolve -- if you were in
@@ -291,6 +300,9 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
time_left = wait_for_completion_timeout(&i2c_dev->completion,
adap->timeout);
+
+ bcm2835_i2c_finish_transfer(i2c_dev);
+
if (!time_left) {
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C,
BCM2835_I2C_C_CLEAR);
--
2.19.1
next prev parent reply other threads:[~2019-03-11 20:02 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-11 19:57 [PATCH AUTOSEL 4.14 01/27] drm/imx: ignore plane updates on disabled crtcs Sasha Levin
2019-03-11 19:57 ` [PATCH AUTOSEL 4.14 02/27] gpu: ipu-v3: Fix i.MX51 CSI control registers offset Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 03/27] drm/imx: imx-ldb: add missing of_node_puts Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 04/27] gpu: ipu-v3: Fix CSI offsets for imx53 Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 05/27] s390/dasd: fix using offset into zero size array error Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 06/27] Input: pwm-vibra - prevent unbalanced regulator Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 07/27] Input: pwm-vibra - stop regulator after disabling pwm, not before Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 08/27] ARM: OMAP2+: Variable "reg" in function omap4_dsi_mux_pads() could be uninitialized Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 09/27] ASoC: dapm: fix out-of-bounds accesses to DAPM lookup tables Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 10/27] ASoC: rsnd: fixup rsnd_ssi_master_clk_start() user count check Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 11/27] KVM: arm/arm64: Reset the VCPU without preemption and vcpu state loaded Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 12/27] ARM: OMAP2+: fix lack of timer interrupts on CPU1 after hotplug Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 13/27] Input: cap11xx - switch to using set_brightness_blocking() Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 14/27] Input: ps2-gpio - flush TX work when closing port Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 15/27] Input: matrix_keypad - use flush_delayed_work() Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 16/27] mac80211: Fix Tx aggregation session tear down with ITXQs Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 17/27] ipvs: fix dependency on nf_defrag_ipv6 Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 18/27] floppy: check_events callback should not return a negative number Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 19/27] NFS: Don't use page_file_mapping after removing the page Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 20/27] mm/gup: fix gup_pmd_range() for dax Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 21/27] Revert "mm: use early_pfn_to_nid in page_ext_init" Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 22/27] mm: page_alloc: fix ref bias in page_frag_alloc() for 1-byte allocs Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 23/27] net: hns: Fix object reference leaks in hns_dsaf_roce_reset() Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 24/27] i2c: cadence: Fix the hold bit setting Sasha Levin
2019-03-11 19:58 ` Sasha Levin [this message]
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 26/27] auxdisplay: ht16k33: fix potential user-after-free on module unload Sasha Levin
2019-03-11 19:58 ` [PATCH AUTOSEL 4.14 27/27] Input: st-keyscan - fix potential zalloc NULL dereference Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190311195824.139043-25-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=paul.kocialkowski@bootlin.com \
--cc=stable@vger.kernel.org \
--cc=wsa@the-dreams.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).