From: Jérôme Pouiller <jerome.pouil...@silabs.com>

Original code did not handle case where kmalloc failed. By the way, it
is more convenient to allocate and build HIF message in
hif_set_beacon_filter_table() instead of to ask to caller function to
build it.

Fixes: 40115bbc40e2 ("staging: wfx: implement the rest of mac80211 API")
Reported-by: kbuild test robot <l...@intel.com>
Signed-off-by: Jérôme Pouiller <jerome.pouil...@silabs.com>
---
 drivers/staging/wfx/hif_tx_mib.h | 19 ++++++++++++++-----
 drivers/staging/wfx/sta.c        | 17 +++++++----------
 2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/staging/wfx/hif_tx_mib.h b/drivers/staging/wfx/hif_tx_mib.h
index f6624a403016..167c5dec009f 100644
--- a/drivers/staging/wfx/hif_tx_mib.h
+++ b/drivers/staging/wfx/hif_tx_mib.h
@@ -86,13 +86,22 @@ static inline int hif_set_rx_filter(struct wfx_vif *wvif, 
bool filter_bssid,
 }
 
 static inline int hif_set_beacon_filter_table(struct wfx_vif *wvif,
-                                             struct hif_mib_bcn_filter_table 
*ft)
+                                             int tbl_len,
+                                             struct hif_ie_table_entry *tbl)
 {
-       size_t buf_len = struct_size(ft, ie_table, ft->num_of_info_elmts);
+       int ret;
+       struct hif_mib_bcn_filter_table *val;
+       int buf_len = struct_size(val, ie_table, tbl_len);
 
-       cpu_to_le32s(&ft->num_of_info_elmts);
-       return hif_write_mib(wvif->wdev, wvif->id,
-                            HIF_MIB_ID_BEACON_FILTER_TABLE, ft, buf_len);
+       val = kzalloc(buf_len, GFP_KERNEL);
+       if (!val)
+               return -ENOMEM;
+       val->num_of_info_elmts = cpu_to_le32(tbl_len);
+       memcpy(val->ie_table, tbl, tbl_len * sizeof(*tbl));
+       ret = hif_write_mib(wvif->wdev, wvif->id,
+                           HIF_MIB_ID_BEACON_FILTER_TABLE, val, buf_len);
+       kfree(val);
+       return ret;
 }
 
 static inline int hif_beacon_filter_control(struct wfx_vif *wvif,
diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 2855d14a709c..12198b8f3685 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -217,14 +217,13 @@ void wfx_update_filtering(struct wfx_vif *wvif)
        bool filter_bssid = wvif->filter_bssid;
        bool fwd_probe_req = wvif->fwd_probe_req;
        struct hif_mib_bcn_filter_enable bf_ctrl;
-       struct hif_mib_bcn_filter_table *bf_tbl;
-       struct hif_ie_table_entry ie_tbl[] = {
+       struct hif_ie_table_entry filter_ies[] = {
                {
                        .ie_id        = WLAN_EID_VENDOR_SPECIFIC,
                        .has_changed  = 1,
                        .no_longer    = 1,
                        .has_appeared = 1,
-                       .oui         = { 0x50, 0x6F, 0x9A},
+                       .oui          = { 0x50, 0x6F, 0x9A },
                }, {
                        .ie_id        = WLAN_EID_HT_OPERATION,
                        .has_changed  = 1,
@@ -237,36 +236,34 @@ void wfx_update_filtering(struct wfx_vif *wvif)
                        .has_appeared = 1,
                }
        };
+       int n_filter_ies;
 
        if (wvif->state == WFX_STATE_PASSIVE)
                return;
 
-       bf_tbl = kmalloc(sizeof(struct hif_mib_bcn_filter_table) + 
sizeof(ie_tbl), GFP_KERNEL);
-       memcpy(bf_tbl->ie_table, ie_tbl, sizeof(ie_tbl));
        if (wvif->disable_beacon_filter) {
                bf_ctrl.enable = 0;
                bf_ctrl.bcn_count = 1;
-               bf_tbl->num_of_info_elmts = 0;
+               n_filter_ies = 0;
        } else if (!is_sta) {
                bf_ctrl.enable = HIF_BEACON_FILTER_ENABLE | 
HIF_BEACON_FILTER_AUTO_ERP;
                bf_ctrl.bcn_count = 0;
-               bf_tbl->num_of_info_elmts = 2;
+               n_filter_ies = 2;
        } else {
                bf_ctrl.enable = HIF_BEACON_FILTER_ENABLE;
                bf_ctrl.bcn_count = 0;
-               bf_tbl->num_of_info_elmts = 3;
+               n_filter_ies = 3;
        }
 
        ret = hif_set_rx_filter(wvif, filter_bssid, fwd_probe_req);
        if (!ret)
-               ret = hif_set_beacon_filter_table(wvif, bf_tbl);
+               ret = hif_set_beacon_filter_table(wvif, n_filter_ies, 
filter_ies);
        if (!ret)
                ret = hif_beacon_filter_control(wvif, bf_ctrl.enable, 
bf_ctrl.bcn_count);
        if (!ret)
                ret = wfx_set_mcast_filter(wvif, &wvif->mcast_filter);
        if (ret)
                dev_err(wvif->wdev->dev, "update filtering failed: %d\n", ret);
-       kfree(bf_tbl);
 }
 
 void wfx_update_filtering_work(struct work_struct *work)
-- 
2.20.1
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to