Blame SOURCES/scsi-iscsi-kpatch-fixes-for-CVE-2021-27364-and-CVE-2.patch

45e3f8
From 7627b7136546892ed803c6f41153d0674c05fc1f Mon Sep 17 00:00:00 2001
45e3f8
From: Joe Lawrence <joe.lawrence@redhat.com>
45e3f8
Date: Fri, 26 Mar 2021 13:24:17 -0400
45e3f8
Subject: [PATCH] scsi: iscsi: kpatch fixes for CVE-2021-27364 and
45e3f8
 CVE-2021-27365
45e3f8
45e3f8
Notes: backport CVE-2021-27363 to simplify patchset
45e3f8
       see [JL] notes in commit msgs below correcting CVE numbers
45e3f8
45e3f8
Kernels:
45e3f8
3.10.0-1160.el7
45e3f8
3.10.0-1160.2.1.el7
45e3f8
3.10.0-1160.2.2.el7
45e3f8
3.10.0-1160.6.1.el7
45e3f8
3.10.0-1160.11.1.el7
45e3f8
3.10.0-1160.15.2.el7
45e3f8
3.10.0-1160.21.1.el7
45e3f8
45e3f8
Changes since last build:
45e3f8
arches: x86_64 ppc64le
45e3f8
libiscsi.o: changed function: iscsi_conn_get_addr_param
45e3f8
libiscsi.o: changed function: iscsi_conn_get_param
45e3f8
libiscsi.o: changed function: iscsi_host_get_param
45e3f8
libiscsi.o: changed function: iscsi_session_get_param
45e3f8
scsi_transport_iscsi.o: changed function: iscsi_if_recv_msg
45e3f8
scsi_transport_iscsi.o: changed function: show_ep_handle
45e3f8
scsi_transport_iscsi.o: changed function: show_priv_session_creator
45e3f8
scsi_transport_iscsi.o: changed function: show_priv_session_recovery_tmo
45e3f8
scsi_transport_iscsi.o: changed function: show_priv_session_state
45e3f8
scsi_transport_iscsi.o: changed function: show_priv_session_target_id
45e3f8
scsi_transport_iscsi.o: changed function: show_transport_caps
45e3f8
scsi_transport_iscsi.o: changed function: show_transport_handle
45e3f8
---------------------------
45e3f8
45e3f8
Modifications: none
45e3f8
45e3f8
commit b307f0f6090743a904454f6ecc54d290ca18a693
45e3f8
Author: Chris Leech <cleech@redhat.com>
45e3f8
Date:   Thu Mar 4 09:55:32 2021 -0800
45e3f8
45e3f8
    scsi: iscsi: Restrict sessions and handles to admin capabilities
45e3f8
45e3f8
    Bugzilla: http://bugzilla.redhat.com/1930807
45e3f8
    CVE: CVE-2021-27364		<< [JL] should be CVE-2021-27363
45e3f8
45e3f8
    commit 688e8128b7a92df982709a4137ea4588d16f24aa
45e3f8
    Author: Lee Duncan <lduncan@suse.com>
45e3f8
    Date:   Tue Feb 23 13:06:24 2021 -0800
45e3f8
45e3f8
        scsi: iscsi: Restrict sessions and handles to admin capabilities
45e3f8
45e3f8
        Protect the iSCSI transport handle, available in sysfs, by requiring
45e3f8
        CAP_SYS_ADMIN to read it. Also protect the netlink socket by restricting
45e3f8
        reception of messages to ones sent with CAP_SYS_ADMIN. This disables
45e3f8
        normal users from being able to end arbitrary iSCSI sessions.
45e3f8
45e3f8
        Cc: stable@vger.kernel.org
45e3f8
        Reported-by: Adam Nichols <adam@grimm-co.com>
45e3f8
        Reviewed-by: Chris Leech <cleech@redhat.com>
45e3f8
        Reviewed-by: Mike Christie <michael.christie@oracle.com>
45e3f8
        Signed-off-by: Lee Duncan <lduncan@suse.com>
45e3f8
        Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
45e3f8
45e3f8
    Signed-off-by: Chris Leech <cleech@redhat.com>
45e3f8
45e3f8
commit af581fe518f4d6a6f28064f932d9374e0444d706
45e3f8
Author: Chris Leech <cleech@redhat.com>
45e3f8
Date:   Thu Mar 4 09:57:23 2021 -0800
45e3f8
45e3f8
    scsi: iscsi: Ensure sysfs attributes are limited to PAGE_SIZE
45e3f8
45e3f8
    Bugzilla: http://bugzilla.redhat.com/1930849
45e3f8
    CVE: CVE-2021-27363		<< [JL] should be CVE-2021-27365
45e3f8
45e3f8
    Conflicts: The sysfs_emit helper doesn't exist for backports, but other
45e3f8
    than a sanity check on buf it's just a call to scnprintf with a
45e3f8
    PAGE_SIZE limit.
45e3f8
    converted with s/sysfs_emit(buf,/scnprintf(buf, PAGE_SIZE,/
45e3f8
45e3f8
    commit ec98ea7070e94cc25a422ec97d1421e28d97b7ee
45e3f8
    Author: Chris Leech <cleech@redhat.com>
45e3f8
    Date:   Tue Feb 23 18:00:17 2021 -0800
45e3f8
45e3f8
        scsi: iscsi: Ensure sysfs attributes are limited to PAGE_SIZE
45e3f8
45e3f8
        As the iSCSI parameters are exported back through sysfs, it should be
45e3f8
        enforcing that they never are more than PAGE_SIZE (which should be more
45e3f8
        than enough) before accepting updates through netlink.
45e3f8
45e3f8
        Change all iSCSI sysfs attributes to use sysfs_emit().
45e3f8
45e3f8
        Cc: stable@vger.kernel.org
45e3f8
        Reported-by: Adam Nichols <adam@grimm-co.com>
45e3f8
        Reviewed-by: Lee Duncan <lduncan@suse.com>
45e3f8
        Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
45e3f8
        Reviewed-by: Mike Christie <michael.christie@oracle.com>
45e3f8
        Signed-off-by: Chris Leech <cleech@redhat.com>
45e3f8
        Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
45e3f8
45e3f8
    Signed-off-by: Chris Leech <cleech@redhat.com>
45e3f8
45e3f8
commit 8026ca13e283db6175377fccf309e8c5239033be
45e3f8
Author: Chris Leech <cleech@redhat.com>
45e3f8
Date:   Thu Mar 4 09:58:33 2021 -0800
45e3f8
45e3f8
    scsi: iscsi: Verify lengths on passthrough PDUs
45e3f8
45e3f8
    Bugzilla: http://bugzilla.redhat.com/1930826
45e3f8
    CVE: CVE-2021-27365		<< [JL] should be CVE-2021-27364
45e3f8
45e3f8
    commit f9dbdf97a5bd92b1a49cee3d591b55b11fd7a6d5
45e3f8
    Author: Chris Leech <cleech@redhat.com>
45e3f8
    Date:   Tue Feb 23 21:39:01 2021 -0800
45e3f8
45e3f8
        scsi: iscsi: Verify lengths on passthrough PDUs
45e3f8
45e3f8
        Open-iSCSI sends passthrough PDUs over netlink, but the kernel should be
45e3f8
        verifying that the provided PDU header and data lengths fall within the
45e3f8
        netlink message to prevent accessing beyond that in memory.
45e3f8
45e3f8
        Cc: stable@vger.kernel.org
45e3f8
        Reported-by: Adam Nichols <adam@grimm-co.com>
45e3f8
        Reviewed-by: Lee Duncan <lduncan@suse.com>
45e3f8
        Reviewed-by: Mike Christie <michael.christie@oracle.com>
45e3f8
        Signed-off-by: Chris Leech <cleech@redhat.com>
45e3f8
        Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
45e3f8
45e3f8
    Signed-off-by: Chris Leech <cleech@redhat.com>
45e3f8
45e3f8
Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
45e3f8
Acked-by: Artem Savkov <asavkov@redhat.com>
45e3f8
---
45e3f8
 drivers/scsi/libiscsi.c             | 148 ++++++++++++++--------------
45e3f8
 drivers/scsi/scsi_transport_iscsi.c |  38 +++++--
45e3f8
 2 files changed, 104 insertions(+), 82 deletions(-)
45e3f8
45e3f8
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
45e3f8
index bd36ead89f9d..5530662bd9ed 100644
45e3f8
--- a/drivers/scsi/libiscsi.c
45e3f8
+++ b/drivers/scsi/libiscsi.c
45e3f8
@@ -3323,125 +3323,125 @@ int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
45e3f8
 
45e3f8
 	switch(param) {
45e3f8
 	case ISCSI_PARAM_FAST_ABORT:
45e3f8
-		len = sprintf(buf, "%d\n", session->fast_abort);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->fast_abort);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_ABORT_TMO:
45e3f8
-		len = sprintf(buf, "%d\n", session->abort_timeout);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->abort_timeout);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_LU_RESET_TMO:
45e3f8
-		len = sprintf(buf, "%d\n", session->lu_reset_timeout);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->lu_reset_timeout);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TGT_RESET_TMO:
45e3f8
-		len = sprintf(buf, "%d\n", session->tgt_reset_timeout);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->tgt_reset_timeout);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_INITIAL_R2T_EN:
45e3f8
-		len = sprintf(buf, "%d\n", session->initial_r2t_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->initial_r2t_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_MAX_R2T:
45e3f8
-		len = sprintf(buf, "%hu\n", session->max_r2t);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%hu\n", session->max_r2t);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IMM_DATA_EN:
45e3f8
-		len = sprintf(buf, "%d\n", session->imm_data_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->imm_data_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_FIRST_BURST:
45e3f8
-		len = sprintf(buf, "%u\n", session->first_burst);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->first_burst);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_MAX_BURST:
45e3f8
-		len = sprintf(buf, "%u\n", session->max_burst);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->max_burst);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PDU_INORDER_EN:
45e3f8
-		len = sprintf(buf, "%d\n", session->pdu_inorder_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->pdu_inorder_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DATASEQ_INORDER_EN:
45e3f8
-		len = sprintf(buf, "%d\n", session->dataseq_inorder_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->dataseq_inorder_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DEF_TASKMGMT_TMO:
45e3f8
-		len = sprintf(buf, "%d\n", session->def_taskmgmt_tmo);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->def_taskmgmt_tmo);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_ERL:
45e3f8
-		len = sprintf(buf, "%d\n", session->erl);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->erl);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TARGET_NAME:
45e3f8
-		len = sprintf(buf, "%s\n", session->targetname);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->targetname);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TARGET_ALIAS:
45e3f8
-		len = sprintf(buf, "%s\n", session->targetalias);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->targetalias);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TPGT:
45e3f8
-		len = sprintf(buf, "%d\n", session->tpgt);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->tpgt);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_USERNAME:
45e3f8
-		len = sprintf(buf, "%s\n", session->username);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->username);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_USERNAME_IN:
45e3f8
-		len = sprintf(buf, "%s\n", session->username_in);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->username_in);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PASSWORD:
45e3f8
-		len = sprintf(buf, "%s\n", session->password);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->password);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PASSWORD_IN:
45e3f8
-		len = sprintf(buf, "%s\n", session->password_in);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->password_in);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IFACE_NAME:
45e3f8
-		len = sprintf(buf, "%s\n", session->ifacename);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->ifacename);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_INITIATOR_NAME:
45e3f8
-		len = sprintf(buf, "%s\n", session->initiatorname);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->initiatorname);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_BOOT_ROOT:
45e3f8
-		len = sprintf(buf, "%s\n", session->boot_root);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->boot_root);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_BOOT_NIC:
45e3f8
-		len = sprintf(buf, "%s\n", session->boot_nic);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->boot_nic);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_BOOT_TARGET:
45e3f8
-		len = sprintf(buf, "%s\n", session->boot_target);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->boot_target);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_AUTO_SND_TGT_DISABLE:
45e3f8
-		len = sprintf(buf, "%u\n", session->auto_snd_tgt_disable);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->auto_snd_tgt_disable);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DISCOVERY_SESS:
45e3f8
-		len = sprintf(buf, "%u\n", session->discovery_sess);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->discovery_sess);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PORTAL_TYPE:
45e3f8
-		len = sprintf(buf, "%s\n", session->portal_type);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", session->portal_type);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_CHAP_AUTH_EN:
45e3f8
-		len = sprintf(buf, "%u\n", session->chap_auth_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->chap_auth_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DISCOVERY_LOGOUT_EN:
45e3f8
-		len = sprintf(buf, "%u\n", session->discovery_logout_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->discovery_logout_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_BIDI_CHAP_EN:
45e3f8
-		len = sprintf(buf, "%u\n", session->bidi_chap_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->bidi_chap_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL:
45e3f8
-		len = sprintf(buf, "%u\n", session->discovery_auth_optional);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->discovery_auth_optional);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DEF_TIME2WAIT:
45e3f8
-		len = sprintf(buf, "%d\n", session->time2wait);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->time2wait);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DEF_TIME2RETAIN:
45e3f8
-		len = sprintf(buf, "%d\n", session->time2retain);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", session->time2retain);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TSID:
45e3f8
-		len = sprintf(buf, "%u\n", session->tsid);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->tsid);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_ISID:
45e3f8
-		len = sprintf(buf, "%02x%02x%02x%02x%02x%02x\n",
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%02x%02x%02x%02x%02x%02x\n",
45e3f8
 			      session->isid[0], session->isid[1],
45e3f8
 			      session->isid[2], session->isid[3],
45e3f8
 			      session->isid[4], session->isid[5]);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DISCOVERY_PARENT_IDX:
45e3f8
-		len = sprintf(buf, "%u\n", session->discovery_parent_idx);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", session->discovery_parent_idx);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DISCOVERY_PARENT_TYPE:
45e3f8
 		if (session->discovery_parent_type)
45e3f8
-			len = sprintf(buf, "%s\n",
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "%s\n",
45e3f8
 				      session->discovery_parent_type);
45e3f8
 		else
45e3f8
-			len = sprintf(buf, "\n");
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "\n");
45e3f8
 		break;
45e3f8
 	default:
45e3f8
 		return -ENOSYS;
45e3f8
@@ -3473,16 +3473,16 @@ int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
45e3f8
 	case ISCSI_PARAM_CONN_ADDRESS:
45e3f8
 	case ISCSI_HOST_PARAM_IPADDRESS:
45e3f8
 		if (sin)
45e3f8
-			len = sprintf(buf, "%pI4\n", &sin->sin_addr.s_addr);
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "%pI4\n", &sin->sin_addr.s_addr);
45e3f8
 		else
45e3f8
-			len = sprintf(buf, "%pI6\n", &sin6->sin6_addr);
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "%pI6\n", &sin6->sin6_addr);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_CONN_PORT:
45e3f8
 	case ISCSI_PARAM_LOCAL_PORT:
45e3f8
 		if (sin)
45e3f8
-			len = sprintf(buf, "%hu\n", be16_to_cpu(sin->sin_port));
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "%hu\n", be16_to_cpu(sin->sin_port));
45e3f8
 		else
45e3f8
-			len = sprintf(buf, "%hu\n",
45e3f8
+			len = scnprintf(buf, PAGE_SIZE, "%hu\n",
45e3f8
 				      be16_to_cpu(sin6->sin6_port));
45e3f8
 		break;
45e3f8
 	default:
45e3f8
@@ -3501,88 +3501,88 @@ int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
45e3f8
 
45e3f8
 	switch(param) {
45e3f8
 	case ISCSI_PARAM_PING_TMO:
45e3f8
-		len = sprintf(buf, "%u\n", conn->ping_timeout);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->ping_timeout);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_RECV_TMO:
45e3f8
-		len = sprintf(buf, "%u\n", conn->recv_timeout);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->recv_timeout);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_MAX_RECV_DLENGTH:
45e3f8
-		len = sprintf(buf, "%u\n", conn->max_recv_dlength);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->max_recv_dlength);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_MAX_XMIT_DLENGTH:
45e3f8
-		len = sprintf(buf, "%u\n", conn->max_xmit_dlength);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->max_xmit_dlength);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_HDRDGST_EN:
45e3f8
-		len = sprintf(buf, "%d\n", conn->hdrdgst_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", conn->hdrdgst_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_DATADGST_EN:
45e3f8
-		len = sprintf(buf, "%d\n", conn->datadgst_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", conn->datadgst_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IFMARKER_EN:
45e3f8
-		len = sprintf(buf, "%d\n", conn->ifmarker_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", conn->ifmarker_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_OFMARKER_EN:
45e3f8
-		len = sprintf(buf, "%d\n", conn->ofmarker_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", conn->ofmarker_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_EXP_STATSN:
45e3f8
-		len = sprintf(buf, "%u\n", conn->exp_statsn);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->exp_statsn);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PERSISTENT_PORT:
45e3f8
-		len = sprintf(buf, "%d\n", conn->persistent_port);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%d\n", conn->persistent_port);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_PERSISTENT_ADDRESS:
45e3f8
-		len = sprintf(buf, "%s\n", conn->persistent_address);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", conn->persistent_address);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_STATSN:
45e3f8
-		len = sprintf(buf, "%u\n", conn->statsn);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->statsn);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_MAX_SEGMENT_SIZE:
45e3f8
-		len = sprintf(buf, "%u\n", conn->max_segment_size);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->max_segment_size);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_KEEPALIVE_TMO:
45e3f8
-		len = sprintf(buf, "%u\n", conn->keepalive_tmo);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->keepalive_tmo);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_LOCAL_PORT:
45e3f8
-		len = sprintf(buf, "%u\n", conn->local_port);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->local_port);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_TIMESTAMP_STAT:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_timestamp_stat);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_timestamp_stat);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_NAGLE_DISABLE:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_nagle_disable);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_nagle_disable);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_WSF_DISABLE:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_wsf_disable);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_wsf_disable);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_TIMER_SCALE:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_timer_scale);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_timer_scale);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_TIMESTAMP_EN:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_timestamp_en);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_timestamp_en);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IP_FRAGMENT_DISABLE:
45e3f8
-		len = sprintf(buf, "%u\n", conn->fragment_disable);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->fragment_disable);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IPV4_TOS:
45e3f8
-		len = sprintf(buf, "%u\n", conn->ipv4_tos);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->ipv4_tos);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IPV6_TC:
45e3f8
-		len = sprintf(buf, "%u\n", conn->ipv6_traffic_class);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->ipv6_traffic_class);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IPV6_FLOW_LABEL:
45e3f8
-		len = sprintf(buf, "%u\n", conn->ipv6_flow_label);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->ipv6_flow_label);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_IS_FW_ASSIGNED_IPV6:
45e3f8
-		len = sprintf(buf, "%u\n", conn->is_fw_assigned_ipv6);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->is_fw_assigned_ipv6);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_XMIT_WSF:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_xmit_wsf);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_xmit_wsf);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_TCP_RECV_WSF:
45e3f8
-		len = sprintf(buf, "%u\n", conn->tcp_recv_wsf);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%u\n", conn->tcp_recv_wsf);
45e3f8
 		break;
45e3f8
 	case ISCSI_PARAM_LOCAL_IPADDR:
45e3f8
-		len = sprintf(buf, "%s\n", conn->local_ipaddr);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", conn->local_ipaddr);
45e3f8
 		break;
45e3f8
 	default:
45e3f8
 		return -ENOSYS;
45e3f8
@@ -3600,13 +3600,13 @@ int iscsi_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
45e3f8
 
45e3f8
 	switch (param) {
45e3f8
 	case ISCSI_HOST_PARAM_NETDEV_NAME:
45e3f8
-		len = sprintf(buf, "%s\n", ihost->netdev);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", ihost->netdev);
45e3f8
 		break;
45e3f8
 	case ISCSI_HOST_PARAM_HWADDRESS:
45e3f8
-		len = sprintf(buf, "%s\n", ihost->hwaddress);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", ihost->hwaddress);
45e3f8
 		break;
45e3f8
 	case ISCSI_HOST_PARAM_INITIATOR_NAME:
45e3f8
-		len = sprintf(buf, "%s\n", ihost->initiatorname);
45e3f8
+		len = scnprintf(buf, PAGE_SIZE, "%s\n", ihost->initiatorname);
45e3f8
 		break;
45e3f8
 	default:
45e3f8
 		return -ENOSYS;
45e3f8
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
45e3f8
index 2265611b7e37..f0738bb165f2 100644
45e3f8
--- a/drivers/scsi/scsi_transport_iscsi.c
45e3f8
+++ b/drivers/scsi/scsi_transport_iscsi.c
45e3f8
@@ -119,7 +119,11 @@ show_transport_handle(struct device *dev, struct device_attribute *attr,
45e3f8
 		      char *buf)
45e3f8
 {
45e3f8
 	struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
45e3f8
-	return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
45e3f8
+
45e3f8
+	if (!capable(CAP_SYS_ADMIN))
45e3f8
+		return -EACCES;
45e3f8
+	return scnprintf(buf, PAGE_SIZE, "%llu\n",
45e3f8
+		  (unsigned long long)iscsi_handle(priv->iscsi_transport));
45e3f8
 }
45e3f8
 static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
45e3f8
 
45e3f8
@@ -129,7 +133,7 @@ show_transport_##name(struct device *dev, 				\
45e3f8
 		      struct device_attribute *attr,char *buf)		\
45e3f8
 {									\
45e3f8
 	struct iscsi_internal *priv = dev_to_iscsi_internal(dev);	\
45e3f8
-	return sprintf(buf, format"\n", priv->iscsi_transport->name);	\
45e3f8
+	return scnprintf(buf, PAGE_SIZE, format"\n", priv->iscsi_transport->name);\
45e3f8
 }									\
45e3f8
 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
45e3f8
 
45e3f8
@@ -170,7 +174,7 @@ static ssize_t
45e3f8
 show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf)
45e3f8
 {
45e3f8
 	struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
45e3f8
-	return sprintf(buf, "%llu\n", (unsigned long long) ep->id);
45e3f8
+	return scnprintf(buf, PAGE_SIZE, "%llu\n", (unsigned long long) ep->id);
45e3f8
 }
45e3f8
 static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
45e3f8
 
45e3f8
@@ -2779,6 +2783,9 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
45e3f8
 	struct iscsi_cls_session *session;
45e3f8
 	int err = 0, value = 0;
45e3f8
 
45e3f8
+	if (ev->u.set_param.len > PAGE_SIZE)
45e3f8
+		return -EINVAL;
45e3f8
+
45e3f8
 	session = iscsi_session_lookup(ev->u.set_param.sid);
45e3f8
 	conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
45e3f8
 	if (!conn || !session)
45e3f8
@@ -2926,6 +2933,9 @@ iscsi_set_host_param(struct iscsi_transport *transport,
45e3f8
 	if (!transport->set_host_param)
45e3f8
 		return -ENOSYS;
45e3f8
 
45e3f8
+	if (ev->u.set_host_param.len > PAGE_SIZE)
45e3f8
+		return -EINVAL;
45e3f8
+
45e3f8
 	shost = scsi_host_lookup(ev->u.set_host_param.host_no);
45e3f8
 	if (!shost) {
45e3f8
 		printk(KERN_ERR "set_host_param could not find host no %u\n",
45e3f8
@@ -3495,6 +3505,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
45e3f8
 {
45e3f8
 	int err = 0;
45e3f8
 	u32 portid;
45e3f8
+	u32 pdu_len;
45e3f8
 	struct iscsi_uevent *ev = nlmsg_data(nlh);
45e3f8
 	struct iscsi_transport *transport = NULL;
45e3f8
 	struct iscsi_internal *priv;
45e3f8
@@ -3502,6 +3513,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
45e3f8
 	struct iscsi_cls_conn *conn;
45e3f8
 	struct iscsi_endpoint *ep = NULL;
45e3f8
 
45e3f8
+	if (!netlink_capable(skb, CAP_SYS_ADMIN))
45e3f8
+		return -EPERM;
45e3f8
+
45e3f8
 	if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE)
45e3f8
 		*group = ISCSI_NL_GRP_UIP;
45e3f8
 	else
45e3f8
@@ -3607,6 +3621,14 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
45e3f8
 			err = -EINVAL;
45e3f8
 		break;
45e3f8
 	case ISCSI_UEVENT_SEND_PDU:
45e3f8
+		pdu_len = nlh->nlmsg_len - sizeof(*nlh) - sizeof(*ev);
45e3f8
+
45e3f8
+		if ((ev->u.send_pdu.hdr_size > pdu_len) ||
45e3f8
+		    (ev->u.send_pdu.data_size > (pdu_len - ev->u.send_pdu.hdr_size))) {
45e3f8
+			err = -EINVAL;
45e3f8
+			break;
45e3f8
+		}
45e3f8
+
45e3f8
 		conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
45e3f8
 		if (conn)
45e3f8
 			ev->r.retcode =	transport->send_pdu(conn,
45e3f8
@@ -4013,7 +4035,7 @@ show_priv_session_state(struct device *dev, struct device_attribute *attr,
45e3f8
 			char *buf)
45e3f8
 {
45e3f8
 	struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
45e3f8
-	return sprintf(buf, "%s\n", iscsi_session_state_name(session->state));
45e3f8
+	return scnprintf(buf, PAGE_SIZE, "%s\n", iscsi_session_state_name(session->state));
45e3f8
 }
45e3f8
 static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state,
45e3f8
 			NULL);
45e3f8
@@ -4022,7 +4044,7 @@ show_priv_session_creator(struct device *dev, struct device_attribute *attr,
45e3f8
 			char *buf)
45e3f8
 {
45e3f8
 	struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
45e3f8
-	return sprintf(buf, "%d\n", session->creator);
45e3f8
+	return scnprintf(buf, PAGE_SIZE, "%d\n", session->creator);
45e3f8
 }
45e3f8
 static ISCSI_CLASS_ATTR(priv_sess, creator, S_IRUGO, show_priv_session_creator,
45e3f8
 			NULL);
45e3f8
@@ -4031,7 +4053,7 @@ show_priv_session_target_id(struct device *dev, struct device_attribute *attr,
45e3f8
 			    char *buf)
45e3f8
 {
45e3f8
 	struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
45e3f8
-	return sprintf(buf, "%d\n", session->target_id);
45e3f8
+	return scnprintf(buf, PAGE_SIZE, "%d\n", session->target_id);
45e3f8
 }
45e3f8
 static ISCSI_CLASS_ATTR(priv_sess, target_id, S_IRUGO,
45e3f8
 			show_priv_session_target_id, NULL);
45e3f8
@@ -4044,8 +4066,8 @@ show_priv_session_##field(struct device *dev, 				\
45e3f8
 	struct iscsi_cls_session *session = 				\
45e3f8
 			iscsi_dev_to_session(dev->parent);		\
45e3f8
 	if (session->field == -1)					\
45e3f8
-		return sprintf(buf, "off\n");				\
45e3f8
-	return sprintf(buf, format"\n", session->field);		\
45e3f8
+		return scnprintf(buf, PAGE_SIZE, "off\n");			\
45e3f8
+	return scnprintf(buf, PAGE_SIZE, format"\n", session->field);		\
45e3f8
 }
45e3f8
 
45e3f8
 #define iscsi_priv_session_attr_store(field)				\
45e3f8
-- 
45e3f8
2.26.2
45e3f8