diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2006-07-24 16:47:17 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-07-28 12:48:01 -0400 |
commit | 275fd7d129fdd16d1dc0ec6a8d60bd6b72a76e31 (patch) | |
tree | e87776f201ceef9a53ec7c74ae65fe465d2e0829 /drivers/scsi | |
parent | b6c395ed0387c824ddf125d3b74b576a2575c149 (diff) |
[SCSI] iscsi bugfixes: handle data rsp errors
if iscsi_data_rsp fails we must bail out. Since the pdu values like
data length are invalid we cannot continue to process the data since
it could over run buffers.
This fixes a bug with cisco 5428s where that target is sending
too much data.
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index ab324d984b8d..7d784596a1ea 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -486,6 +486,8 @@ iscsi_tcp_hdr_recv(struct iscsi_conn *conn) | |||
486 | case ISCSI_OP_SCSI_DATA_IN: | 486 | case ISCSI_OP_SCSI_DATA_IN: |
487 | tcp_conn->in.ctask = session->cmds[itt]; | 487 | tcp_conn->in.ctask = session->cmds[itt]; |
488 | rc = iscsi_data_rsp(conn, tcp_conn->in.ctask); | 488 | rc = iscsi_data_rsp(conn, tcp_conn->in.ctask); |
489 | if (rc) | ||
490 | return rc; | ||
489 | /* fall through */ | 491 | /* fall through */ |
490 | case ISCSI_OP_SCSI_CMD_RSP: | 492 | case ISCSI_OP_SCSI_CMD_RSP: |
491 | tcp_conn->in.ctask = session->cmds[itt]; | 493 | tcp_conn->in.ctask = session->cmds[itt]; |
@@ -532,7 +534,7 @@ copy_hdr: | |||
532 | * skbs to complete the command then we have to copy the header | 534 | * skbs to complete the command then we have to copy the header |
533 | * for later use | 535 | * for later use |
534 | */ | 536 | */ |
535 | if (tcp_conn->in.zero_copy_hdr && tcp_conn->in.copy < | 537 | if (tcp_conn->in.zero_copy_hdr && tcp_conn->in.copy <= |
536 | (tcp_conn->in.datalen + tcp_conn->in.padding + | 538 | (tcp_conn->in.datalen + tcp_conn->in.padding + |
537 | (conn->datadgst_en ? 4 : 0))) { | 539 | (conn->datadgst_en ? 4 : 0))) { |
538 | debug_tcp("Copying header for later use. in.copy %d in.datalen" | 540 | debug_tcp("Copying header for later use. in.copy %d in.datalen" |