mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
Input: rmi_smbus - fix out-of-bounds read in rmi_smb_write_block()
When chunking writes into SMBus blocks in rmi_smb_write_block(), the
loop calculates block_len using the original total length (len) instead
of the remaining length (cur_len).
If len is greater than 32 bytes (SMB_MAX_COUNT), block_len remains 32
for every iteration, even on the final partial chunk where fewer than 32
bytes remain. This causes smb_block_write() to read 32 bytes from the
advanced data buffer pointer, reading past the end of the input buffer.
Fix this by calculating block_len using cur_len and advancing the buffer
and address pointers by block_len.
Fixes: 82264d0cf7 ("Input: synaptics-rmi4 - add SMBus support")
Cc: stable@vger.kernel.org
Reported-by: sashiko-bot@kernel.org
Assisted-by: LLM
Link: https://patch.msgid.link/anLFSMKSoKyyZ272@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
aefbda23ee
commit
51cfe54f81
|
|
@ -140,7 +140,7 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
|
|||
u8 commandcode;
|
||||
struct rmi_smb_xport *rmi_smb =
|
||||
container_of(xport, struct rmi_smb_xport, xport);
|
||||
int cur_len = (int)len;
|
||||
size_t cur_len = len;
|
||||
|
||||
mutex_lock(&rmi_smb->page_mutex);
|
||||
|
||||
|
|
@ -148,7 +148,7 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
|
|||
/*
|
||||
* break into 32 bytes chunks to write get command code
|
||||
*/
|
||||
int block_len = min_t(int, len, SMB_MAX_COUNT);
|
||||
int block_len = min_t(size_t, cur_len, SMB_MAX_COUNT);
|
||||
|
||||
retval = rmi_smb_get_command_code(xport, rmiaddr, block_len,
|
||||
false, &commandcode);
|
||||
|
|
@ -161,9 +161,9 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
|
|||
goto exit;
|
||||
|
||||
/* prepare to write next block of bytes */
|
||||
cur_len -= SMB_MAX_COUNT;
|
||||
databuff += SMB_MAX_COUNT;
|
||||
rmiaddr += SMB_MAX_COUNT;
|
||||
cur_len -= block_len;
|
||||
databuff += block_len;
|
||||
rmiaddr += block_len;
|
||||
}
|
||||
exit:
|
||||
mutex_unlock(&rmi_smb->page_mutex);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user