Received: by 10.213.65.68 with SMTP id h4csp1583678imn; Mon, 26 Mar 2018 10:18:21 -0700 (PDT) X-Google-Smtp-Source: AG47ELtRuMck1qkMOinUPpdfnoI/RL+Zvlt5tnQBw7iNwFBoNDQIeoNbK91Vc0d7LYzomwgiR5KO X-Received: by 10.101.89.74 with SMTP id g10mr28936839pgu.415.1522084701131; Mon, 26 Mar 2018 10:18:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522084701; cv=none; d=google.com; s=arc-20160816; b=eAPgdSBsDioNygARfOxeSa/fTMycUS+5UsgI1H64HiM+0OtW2bW122e2mYjXTCmE0Z 5wSGSidG2F0Rv7P/K///pmZIMMVdNapgWE633kqWRNT/PQ9anffValVGLyF/NP3YsRj2 Ghs7myYjahUmWZLVF1M6KBodl9tbblIQWdvNMBlwHai+WW54tfIEAu3Ms+eAhc00pZyi TPbVhA7Gruky77U061uv5i/tMv7eTB9MFHGt7GJEL/rSAIih6+Li/Veq73ILFFHEHPmr khF1nXZaiLd3QpFEGqzQJz+hr9y2QxR9VaPjgGFAkL2xotYpBV8ayNC5X80r2kqm4grZ nGdw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:arc-authentication-results; bh=2cQmFKqhaLp2q5pBFAELrDsmN9GyY/PDFeTp7JsGYN0=; b=qw2blTsZfIGUZONHHTBA9ZFGS6SDN8DjbzSGmuQZVoV8RZzIABZkLRhRFHk6AMw/Wz OzxkeNVlNJGb+Lugi5esVyxCSh4x838UdieYRmsJFnk0KO5C0f/fs/3FGkoO+0l1hTOx lq2eFHY18EVwGLY30gZBilVbL8HS4Zfqs7DqPS7nZJYFD+oT0S4GycOFabDkvhistFKO 0cMu2/0GER/N8jYXoIAOnMuNuAb2dUOk+qydvHT1G4EuryOIvD00moEYCnVgfCxcTZ4c AS7bh1Emp+Ko+ED68MXRKsB1aAnxZ3J8Lli0kx/Cwvf2JSByWf4D2Ypq4UviEIxTijxW SdXA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u91-v6si15293773plb.698.2018.03.26.10.18.03; Mon, 26 Mar 2018 10:18:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752717AbeCZRQm (ORCPT + 99 others); Mon, 26 Mar 2018 13:16:42 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:57968 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752116AbeCZRQc (ORCPT ); Mon, 26 Mar 2018 13:16:32 -0400 Received: from 1.general.cking.uk.vpn ([10.172.193.212] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1f0VjR-0008Aw-Jj; Mon, 26 Mar 2018 17:16:29 +0000 From: Colin King To: Aditya Shankar , Ganesh Krishna , Greg Kroah-Hartman , linux-wireless@vger.kernel.org, devel@driverdev.osuosl.org Cc: kernel-janitors@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] staging: wilc1000: replace kmalloc + memcpy with kmemdup Date: Mon, 26 Mar 2018 18:16:29 +0100 Message-Id: <20180326171629.28700-1-colin.king@canonical.com> X-Mailer: git-send-email 2.15.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Colin Ian King Replace several allocation and memcpys with kmemdup and add in some missing memory allocation failure checks. Also fix an incorrect -EFAULT return with -ENOMEM. Signed-off-by: Colin Ian King --- drivers/staging/wilc1000/host_interface.c | 75 +++++++++++++++++++------------ 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/drivers/staging/wilc1000/host_interface.c b/drivers/staging/wilc1000/host_interface.c index 9b9b86654958..8fd367f87fa5 100644 --- a/drivers/staging/wilc1000/host_interface.c +++ b/drivers/staging/wilc1000/host_interface.c @@ -797,6 +797,10 @@ static s32 handle_scan(struct wilc_vif *vif, struct scan_attr *scan_info) for (i = 0; i < hidden_net->n_ssids; i++) valuesize += ((hidden_net->net_info[i].ssid_len) + 1); hdn_ntwk_wid_val = kmalloc(valuesize + 1, GFP_KERNEL); + if (!hdn_ntwk_wid_val) { + result = -ENOMEM; + goto error; + } wid_list[index].val = hdn_ntwk_wid_val; if (wid_list[index].val) { buffer = wid_list[index].val; @@ -943,39 +947,35 @@ static s32 handle_connect(struct wilc_vif *vif, } if (conn_attr->bssid) { - hif_drv->usr_conn_req.bssid = kmalloc(6, GFP_KERNEL); + hif_drv->usr_conn_req.bssid = kmemdup(conn_attr->bssid, 6, + GFP_KERNEL); if (!hif_drv->usr_conn_req.bssid) { result = -ENOMEM; goto error; } - memcpy(hif_drv->usr_conn_req.bssid, conn_attr->bssid, 6); } hif_drv->usr_conn_req.ssid_len = conn_attr->ssid_len; if (conn_attr->ssid) { - hif_drv->usr_conn_req.ssid = kmalloc(conn_attr->ssid_len + 1, + hif_drv->usr_conn_req.ssid = kmemdup(conn_attr->ssid, + conn_attr->ssid_len + 1, GFP_KERNEL); if (!hif_drv->usr_conn_req.ssid) { result = -ENOMEM; goto error; } - memcpy(hif_drv->usr_conn_req.ssid, - conn_attr->ssid, - conn_attr->ssid_len); hif_drv->usr_conn_req.ssid[conn_attr->ssid_len] = '\0'; } hif_drv->usr_conn_req.ies_len = conn_attr->ies_len; if (conn_attr->ies) { - hif_drv->usr_conn_req.ies = kmalloc(conn_attr->ies_len, + hif_drv->usr_conn_req.ies = kmemdup(conn_attr->ies, + conn_attr->ies_len, GFP_KERNEL); if (!hif_drv->usr_conn_req.ies) { result = -ENOMEM; goto error; } - memcpy(hif_drv->usr_conn_req.ies, - conn_attr->ies, - conn_attr->ies_len); } hif_drv->usr_conn_req.security = conn_attr->security; @@ -1009,9 +1009,12 @@ static s32 handle_connect(struct wilc_vif *vif, if (memcmp("DIRECT-", conn_attr->ssid, 7)) { info_element_size = hif_drv->usr_conn_req.ies_len; - info_element = kmalloc(info_element_size, GFP_KERNEL); - memcpy(info_element, hif_drv->usr_conn_req.ies, - info_element_size); + info_element = kmemdup(hif_drv->usr_conn_req.ies, + info_element_size, GFP_KERNEL); + if (!info_element) { + result = -ENOMEM; + goto error; + } } wid_list[wid_cnt].id = (u16)WID_11I_MODE; wid_list[wid_cnt].type = WID_CHAR; @@ -1039,9 +1042,13 @@ static s32 handle_connect(struct wilc_vif *vif, if (memcmp("DIRECT-", conn_attr->ssid, 7)) { join_req_size = wid_list[wid_cnt].size; join_req = kmalloc(join_req_size, GFP_KERNEL); + if (!join_req) { + result = -ENOMEM; + goto error; + } } if (!wid_list[wid_cnt].val) { - result = -EFAULT; + result = -ENOMEM; goto error; } @@ -1166,11 +1173,13 @@ static s32 handle_connect(struct wilc_vif *vif, if (conn_attr->ies) { conn_info.req_ies_len = conn_attr->ies_len; - conn_info.req_ies = kmalloc(conn_attr->ies_len, + conn_info.req_ies = kmemdup(conn_attr->ies, + conn_attr->ies_len, GFP_KERNEL); - memcpy(conn_info.req_ies, - conn_attr->ies, - conn_attr->ies_len); + if (!conn_info.req_ies) { + result = -ENOMEM; + goto error_free; + } } conn_attr->result(CONN_DISCONN_EVENT_CONN_RESP, @@ -1187,6 +1196,7 @@ static s32 handle_connect(struct wilc_vif *vif, } } +error_free: kfree(conn_attr->bssid); conn_attr->bssid = NULL; @@ -1227,10 +1237,9 @@ static s32 handle_connect_timeout(struct wilc_vif *vif) if (hif_drv->usr_conn_req.ies) { info.req_ies_len = hif_drv->usr_conn_req.ies_len; - info.req_ies = kmalloc(hif_drv->usr_conn_req.ies_len, GFP_KERNEL); - memcpy(info.req_ies, - hif_drv->usr_conn_req.ies, - hif_drv->usr_conn_req.ies_len); + info.req_ies = kmemdup(hif_drv->usr_conn_req.ies, + hif_drv->usr_conn_req.ies_len, + GFP_KERNEL); } hif_drv->usr_conn_req.conn_result(CONN_DISCONN_EVENT_CONN_RESP, @@ -1421,9 +1430,11 @@ static s32 handle_rcvd_gnrl_async_info(struct wilc_vif *vif, if (conn_info.status == SUCCESSFUL_STATUSCODE && connect_resp_info->ies) { conn_info.resp_ies_len = connect_resp_info->ies_len; - conn_info.resp_ies = kmalloc(connect_resp_info->ies_len, GFP_KERNEL); - memcpy(conn_info.resp_ies, connect_resp_info->ies, - connect_resp_info->ies_len); + conn_info.resp_ies = kmemdup(connect_resp_info->ies, + connect_resp_info->ies_len, + GFP_KERNEL); + if (!conn_info.resp_ies) + return -ENOMEM; } if (connect_resp_info) { @@ -3524,8 +3535,11 @@ void wilc_network_info_received(struct wilc *wilc, u8 *buffer, u32 length) msg.vif = vif; msg.body.net_info.len = length; - msg.body.net_info.buffer = kmalloc(length, GFP_KERNEL); - memcpy(msg.body.net_info.buffer, buffer, length); + msg.body.net_info.buffer = kmemdup(buffer, length, GFP_KERNEL); + if (!msg.body.net_info.buffer) { + netdev_err(vif->ndev, "message buffer allocation failed\n"); + return; + } result = wilc_enqueue_cmd(&msg); if (result) @@ -3571,8 +3585,11 @@ void wilc_gnrl_async_info_received(struct wilc *wilc, u8 *buffer, u32 length) msg.vif = vif; msg.body.async_info.len = length; - msg.body.async_info.buffer = kmalloc(length, GFP_KERNEL); - memcpy(msg.body.async_info.buffer, buffer, length); + msg.body.async_info.buffer = kmemdup(buffer, length, GFP_KERNEL); + if (!msg.body.async_info.buffer) { + netdev_err(vif->ndev, "message buffer allocation failed\n"); + return; + } result = wilc_enqueue_cmd(&msg); if (result) -- 2.15.1