mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
scsi: libiscsi_tcp: Prevent R2T range check overflow
An iSCSI target controls the R2T data offset and length as 32-bit
values. Adding them before comparing the result with the SCSI data buffer
length can wrap. An R2T with offset 1 and length U32_MAX then passes the
check for a 4096-byte write.
The transmit path treats the wrapped range as valid, exhausts the command
scatterlist, and dereferences the NULL next entry in
iscsi_tcp_segment_done().
Check the offset first, then compare the length with the remaining bytes in
the data buffer.
Fixes: a081c13e39 ("[SCSI] iscsi_tcp: split module into lib and lld")
Cc: stable@vger.kernel.org
Signed-off-by: Ratnaker Gautam <ratnaker.gautam@kuleuven.be>
Acked-by: Chris Leech <cleech@redhat.com>
Link: https://patch.msgid.link/DB5PR08MB100629CD3750FBF71475B5224FD982@DB5PR08MB10062.eurprd08.prod.outlook.com
Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
parent
a7ac98eb6c
commit
eb7aa7fd67
|
|
@ -601,7 +601,8 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
|
|||
data_length, session->max_burst);
|
||||
|
||||
data_offset = be32_to_cpu(rhdr->data_offset);
|
||||
if (data_offset + data_length > task->sc->sdb.length) {
|
||||
if (data_offset > task->sc->sdb.length ||
|
||||
data_length > task->sc->sdb.length - data_offset) {
|
||||
iscsi_conn_printk(KERN_ERR, conn,
|
||||
"invalid R2T with data len %u at offset %u "
|
||||
"and total length %d\n", data_length,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user