aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/iscsi_tcp.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2006-07-24 16:47:17 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-07-28 12:48:01 -0400
commit275fd7d129fdd16d1dc0ec6a8d60bd6b72a76e31 (patch)
treee87776f201ceef9a53ec7c74ae65fe465d2e0829 /drivers/scsi/iscsi_tcp.c
parentb6c395ed0387c824ddf125d3b74b576a2575c149 (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/iscsi_tcp.c')
-rw-r--r--drivers/scsi/iscsi_tcp.c4
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"