diff options
Diffstat (limited to 'drivers/target/iscsi/iscsi_target.c')
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 1f79a168f1c1..30ca1887516b 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -1995,8 +1995,32 @@ int | |||
1995 | iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | 1995 | iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
1996 | struct iscsi_text *hdr) | 1996 | struct iscsi_text *hdr) |
1997 | { | 1997 | { |
1998 | unsigned char *text_in = cmd->text_in_ptr, *text_ptr; | ||
1998 | int cmdsn_ret; | 1999 | int cmdsn_ret; |
1999 | 2000 | ||
2001 | if (!text_in) { | ||
2002 | pr_err("Unable to locate text_in buffer for sendtargets" | ||
2003 | " discovery\n"); | ||
2004 | goto reject; | ||
2005 | } | ||
2006 | if (strncmp("SendTargets", text_in, 11) != 0) { | ||
2007 | pr_err("Received Text Data that is not" | ||
2008 | " SendTargets, cannot continue.\n"); | ||
2009 | goto reject; | ||
2010 | } | ||
2011 | text_ptr = strchr(text_in, '='); | ||
2012 | if (!text_ptr) { | ||
2013 | pr_err("No \"=\" separator found in Text Data," | ||
2014 | " cannot continue.\n"); | ||
2015 | goto reject; | ||
2016 | } | ||
2017 | if (!strncmp("=All", text_ptr, 4)) { | ||
2018 | cmd->cmd_flags |= IFC_SENDTARGETS_ALL; | ||
2019 | } else { | ||
2020 | pr_err("Unable to locate valid SendTargets=%s value\n", text_ptr); | ||
2021 | goto reject; | ||
2022 | } | ||
2023 | |||
2000 | spin_lock_bh(&conn->cmd_lock); | 2024 | spin_lock_bh(&conn->cmd_lock); |
2001 | list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); | 2025 | list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); |
2002 | spin_unlock_bh(&conn->cmd_lock); | 2026 | spin_unlock_bh(&conn->cmd_lock); |
@@ -2013,6 +2037,10 @@ iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
2013 | } | 2037 | } |
2014 | 2038 | ||
2015 | return iscsit_execute_cmd(cmd, 0); | 2039 | return iscsit_execute_cmd(cmd, 0); |
2040 | |||
2041 | reject: | ||
2042 | return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, | ||
2043 | 0, 0, (unsigned char *)hdr, cmd); | ||
2016 | } | 2044 | } |
2017 | EXPORT_SYMBOL(iscsit_process_text_cmd); | 2045 | EXPORT_SYMBOL(iscsit_process_text_cmd); |
2018 | 2046 | ||
@@ -2031,7 +2059,6 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
2031 | 2059 | ||
2032 | rx_size = payload_length; | 2060 | rx_size = payload_length; |
2033 | if (payload_length) { | 2061 | if (payload_length) { |
2034 | char *text_ptr; | ||
2035 | u32 checksum = 0, data_crc = 0; | 2062 | u32 checksum = 0, data_crc = 0; |
2036 | u32 padding = 0, pad_bytes = 0; | 2063 | u32 padding = 0, pad_bytes = 0; |
2037 | int niov = 0, rx_got; | 2064 | int niov = 0, rx_got; |
@@ -2043,6 +2070,7 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
2043 | " incoming text parameters\n"); | 2070 | " incoming text parameters\n"); |
2044 | goto reject; | 2071 | goto reject; |
2045 | } | 2072 | } |
2073 | cmd->text_in_ptr = text_in; | ||
2046 | 2074 | ||
2047 | memset(iov, 0, 3 * sizeof(struct kvec)); | 2075 | memset(iov, 0, 3 * sizeof(struct kvec)); |
2048 | iov[niov].iov_base = text_in; | 2076 | iov[niov].iov_base = text_in; |
@@ -2101,30 +2129,13 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
2101 | text_in[payload_length - 1] = '\0'; | 2129 | text_in[payload_length - 1] = '\0'; |
2102 | pr_debug("Successfully read %d bytes of text" | 2130 | pr_debug("Successfully read %d bytes of text" |
2103 | " data.\n", payload_length); | 2131 | " data.\n", payload_length); |
2104 | |||
2105 | if (strncmp("SendTargets", text_in, 11) != 0) { | ||
2106 | pr_err("Received Text Data that is not" | ||
2107 | " SendTargets, cannot continue.\n"); | ||
2108 | goto reject; | ||
2109 | } | ||
2110 | text_ptr = strchr(text_in, '='); | ||
2111 | if (!text_ptr) { | ||
2112 | pr_err("No \"=\" separator found in Text Data," | ||
2113 | " cannot continue.\n"); | ||
2114 | goto reject; | ||
2115 | } | ||
2116 | if (strncmp("=All", text_ptr, 4) != 0) { | ||
2117 | pr_err("Unable to locate All value for" | ||
2118 | " SendTargets key, cannot continue.\n"); | ||
2119 | goto reject; | ||
2120 | } | ||
2121 | kfree(text_in); | ||
2122 | } | 2132 | } |
2123 | 2133 | ||
2124 | return iscsit_process_text_cmd(conn, cmd, hdr); | 2134 | return iscsit_process_text_cmd(conn, cmd, hdr); |
2125 | 2135 | ||
2126 | reject: | 2136 | reject: |
2127 | kfree(text_in); | 2137 | kfree(cmd->text_in_ptr); |
2138 | cmd->text_in_ptr = NULL; | ||
2128 | return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, | 2139 | return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2129 | 0, 0, buf, cmd); | 2140 | 0, 0, buf, cmd); |
2130 | } | 2141 | } |