iser: fix segmentation fault when async message pdu is received

The target sometimes sends a logout request to libiscsi
in case it is going down or for some other reason.
The opcode of such a request is ISCSI_PDU_ASYNC_MSG.

On receiving these kinds of PDU, there is no related pdu on the
list of iscsi->waitpdu. Just skip finding them from iscsi->waitpdu.
Or segment fault might happen.

Also rename nop_target label to no_waitpdu to be more clear.

Signed-off-by: Hou Pu <houpu@bytedance.com>
This commit is contained in:
Hou Pu
2020-11-06 17:52:53 +08:00
parent bc83b0ddb0
commit ed90d56579

View File

@@ -1322,7 +1322,10 @@ iser_rcv_completion(struct iser_rx_desc *rx_desc,
uint32_t itt = scsi_get_uint32(&in.hdr[16]);
if (opcode == ISCSI_PDU_NOP_IN && itt == 0xffffffff)
goto nop_target;
goto no_waitpdu;
if (opcode == ISCSI_PDU_ASYNC_MSG)
goto no_waitpdu;
struct iscsi_pdu *iscsi_pdu;
struct iser_pdu *iser_pdu;
@@ -1355,7 +1358,7 @@ iser_rcv_completion(struct iser_rx_desc *rx_desc,
}
}
nop_target:
no_waitpdu:
/* decrementing conn->post_recv_buf_count only --after-- freeing the *
* task eliminates the need to worry on tasks which are completed in *
* parallel to the execution of iser_conn_term. So the code that waits *