From: Chengyu Liu <lui2012qwq@gmail.com>
To: dmitry.torokhov@gmail.com
Cc: linux-input@vger.kernel.org, Chengyu Liu <lui2012qwq@gmail.com>,
stable@vger.kernel.org
Subject: [PATCH 1/2] Input: rmi4 - clamp SMBus block reads to the requested length
Date: Tue, 3 Nov 2026 21:11:26 +0800 [thread overview]
Message-ID: <20261103131127.1585884-2-lui2012qwq@gmail.com> (raw)
In-Reply-To: <20261103131127.1585884-1-lui2012qwq@gmail.com>
smb_block_read() drops its len argument and calls
i2c_smbus_read_block_data(), which copies the device-reported byte
count into the caller's buffer. The core clamps the count to
I2C_SMBUS_BLOCK_MAX (32), but nothing bounds it to the caller's buffer.
rmi_read_pdt_entry() passes a 6-byte stack buffer during PDT scanning
at probe time: a device reporting a count of 32 overruns it by 26
bytes, with contents controlled by the device. rmi_read() with len=1
and all register reads with len < 32 have the same problem.
Bounce the read through a full-size I2C_SMBUS_BLOCK_MAX buffer and
clamp the copy to the requested length.
Found by static analysis (audit of i2c_smbus_read_block_data()
callers).
Fixes: 82264d0cf7ae ("Input: synaptics-rmi4 - add SMBus support")
Cc: stable@vger.kernel.org
Signed-off-by: Chengyu Liu <lui2012qwq@gmail.com>
---
drivers/input/rmi4/rmi_smbus.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/input/rmi4/rmi_smbus.c b/drivers/input/rmi4/rmi_smbus.c
index 8b61c23822..e4d77d1f80 100644
--- a/drivers/input/rmi4/rmi_smbus.c
+++ b/drivers/input/rmi4/rmi_smbus.c
@@ -177,8 +177,23 @@ static int smb_block_read(struct rmi_transport_dev *xport,
struct rmi_smb_xport *rmi_smb =
container_of(xport, struct rmi_smb_xport, xport);
struct i2c_client *client = rmi_smb->client;
+ u8 tmp[I2C_SMBUS_BLOCK_MAX];
+ int retval;
+
+ /*
+ * i2c_smbus_read_block_data() copies the device-reported count
+ * (up to I2C_SMBUS_BLOCK_MAX bytes) without knowing the caller's
+ * buffer size; bounce through a full-size buffer to bound the copy.
+ */
+ retval = i2c_smbus_read_block_data(client, commandcode, tmp);
+ if (retval < 0)
+ return retval;
- return i2c_smbus_read_block_data(client, commandcode, buf);
+ if ((size_t)retval > len)
+ retval = len;
+ memcpy(buf, tmp, retval);
+
+ return retval;
}
static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr,
--
2.25.1
next prev parent reply other threads:[~2026-11-03 13:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 13:11 [PATCH 0/2] Input: clamp SMBus block reads to the caller's buffer Chengyu Liu
2026-11-03 13:11 ` Chengyu Liu [this message]
2026-11-03 13:11 ` [PATCH 2/2] Input: cyapa - " Chengyu Liu
2026-11-03 13:22 ` sashiko-bot
2026-11-03 14:10 ` cy l
2026-11-03 18:48 ` [PATCH 0/2] Input: " Dmitry Torokhov
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=20261103131127.1585884-2-lui2012qwq@gmail.com \
--to=lui2012qwq@gmail.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=stable@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.