summaryrefslogtreecommitdiffstats
path: root/drivers/s390/net
diff options
context:
space:
mode:
authorUrsula Braun <ursula.braun@de.ibm.com>2013-11-06 03:04:52 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-07 03:01:59 -0500
commit6fb392b1a63ae36c31f62bc3fc8630b49d602b62 (patch)
treefbd6562b9f1711c050b0cbfebd61b7b0a7382efa /drivers/s390/net
parent17102f8be41699525cfeeab02adbaf969b156731 (diff)
qeth: avoid buffer overflow in snmp ioctl
Check user-defined length in snmp ioctl request and allow request only if it fits into a qeth command buffer. Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com> Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com> Reviewed-by: Heiko Carstens <heicars2@linux.vnet.ibm.com> Reported-by: Nico Golde <nico@ngolde.de> Reported-by: Fabian Yamaguchi <fabs@goesec.de> Cc: <stable@vger.kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net')
-rw-r--r--drivers/s390/net/qeth_core_main.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 0a328d0d11be..bd8c09e7a8d9 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -4451,7 +4451,7 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4451 struct qeth_cmd_buffer *iob; 4451 struct qeth_cmd_buffer *iob;
4452 struct qeth_ipa_cmd *cmd; 4452 struct qeth_ipa_cmd *cmd;
4453 struct qeth_snmp_ureq *ureq; 4453 struct qeth_snmp_ureq *ureq;
4454 int req_len; 4454 unsigned int req_len;
4455 struct qeth_arp_query_info qinfo = {0, }; 4455 struct qeth_arp_query_info qinfo = {0, };
4456 int rc = 0; 4456 int rc = 0;
4457 4457
@@ -4467,6 +4467,10 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4467 /* skip 4 bytes (data_len struct member) to get req_len */ 4467 /* skip 4 bytes (data_len struct member) to get req_len */
4468 if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int))) 4468 if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int)))
4469 return -EFAULT; 4469 return -EFAULT;
4470 if (req_len > (QETH_BUFSIZE - IPA_PDU_HEADER_SIZE -
4471 sizeof(struct qeth_ipacmd_hdr) -
4472 sizeof(struct qeth_ipacmd_setadpparms_hdr)))
4473 return -EINVAL;
4470 ureq = memdup_user(udata, req_len + sizeof(struct qeth_snmp_ureq_hdr)); 4474 ureq = memdup_user(udata, req_len + sizeof(struct qeth_snmp_ureq_hdr));
4471 if (IS_ERR(ureq)) { 4475 if (IS_ERR(ureq)) {
4472 QETH_CARD_TEXT(card, 2, "snmpnome"); 4476 QETH_CARD_TEXT(card, 2, "snmpnome");