mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
iscsi-target: Always send a response before terminating iSCSI connection
There are some cases, for example when the initiator sends an out-of-bounds ErrorRecoveryLevel value, where the iSCSI target terminates the connection without sending back any error. Audit the login path and add appropriate iscsit_tx_login_rsp() calls to make sure this doesn't happen. Signed-off-by: Roland Dreier <roland@purestorage.com> Cc: <stable@vger.kernel.org> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
64c13330a3
commit
1c5c12c666
2 changed files with 12 additions and 6 deletions
|
@ -127,13 +127,13 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
|
||||||
|
|
||||||
initiatorname_param = iscsi_find_param_from_key(
|
initiatorname_param = iscsi_find_param_from_key(
|
||||||
INITIATORNAME, conn->param_list);
|
INITIATORNAME, conn->param_list);
|
||||||
if (!initiatorname_param)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
sessiontype_param = iscsi_find_param_from_key(
|
sessiontype_param = iscsi_find_param_from_key(
|
||||||
SESSIONTYPE, conn->param_list);
|
SESSIONTYPE, conn->param_list);
|
||||||
if (!sessiontype_param)
|
if (!initiatorname_param || !sessiontype_param) {
|
||||||
|
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
|
||||||
|
ISCSI_LOGIN_STATUS_MISSING_FIELDS);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0;
|
sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0;
|
||||||
|
|
||||||
|
|
|
@ -620,8 +620,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log
|
||||||
login->req_buf,
|
login->req_buf,
|
||||||
payload_length,
|
payload_length,
|
||||||
conn);
|
conn);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
|
||||||
|
ISCSI_LOGIN_STATUS_INIT_ERR);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (login->first_request)
|
if (login->first_request)
|
||||||
if (iscsi_target_check_first_request(conn, login) < 0)
|
if (iscsi_target_check_first_request(conn, login) < 0)
|
||||||
|
@ -636,8 +639,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log
|
||||||
login->rsp_buf,
|
login->rsp_buf,
|
||||||
&login->rsp_length,
|
&login->rsp_length,
|
||||||
conn->param_list);
|
conn->param_list);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
|
||||||
|
ISCSI_LOGIN_STATUS_INIT_ERR);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!login->auth_complete &&
|
if (!login->auth_complete &&
|
||||||
ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) {
|
ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) {
|
||||||
|
|
Loading…
Reference in a new issue