aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/wil6210/cfg80211.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
index 9a9d55b36dc3..a1e226652b4a 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -1580,6 +1580,12 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len,
1580 u8 *buf, *dpos; 1580 u8 *buf, *dpos;
1581 const u8 *spos; 1581 const u8 *spos;
1582 1582
1583 if (!ies1)
1584 ies1_len = 0;
1585
1586 if (!ies2)
1587 ies2_len = 0;
1588
1583 if (ies1_len == 0 && ies2_len == 0) { 1589 if (ies1_len == 0 && ies2_len == 0) {
1584 *merged_ies = NULL; 1590 *merged_ies = NULL;
1585 *merged_len = 0; 1591 *merged_len = 0;
@@ -1589,17 +1595,19 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len,
1589 buf = kmalloc(ies1_len + ies2_len, GFP_KERNEL); 1595 buf = kmalloc(ies1_len + ies2_len, GFP_KERNEL);
1590 if (!buf) 1596 if (!buf)
1591 return -ENOMEM; 1597 return -ENOMEM;
1592 memcpy(buf, ies1, ies1_len); 1598 if (ies1)
1599 memcpy(buf, ies1, ies1_len);
1593 dpos = buf + ies1_len; 1600 dpos = buf + ies1_len;
1594 spos = ies2; 1601 spos = ies2;
1595 while (spos + 1 < ies2 + ies2_len) { 1602 while (spos && (spos + 1 < ies2 + ies2_len)) {
1596 /* IE tag at offset 0, length at offset 1 */ 1603 /* IE tag at offset 0, length at offset 1 */
1597 u16 ielen = 2 + spos[1]; 1604 u16 ielen = 2 + spos[1];
1598 1605
1599 if (spos + ielen > ies2 + ies2_len) 1606 if (spos + ielen > ies2 + ies2_len)
1600 break; 1607 break;
1601 if (spos[0] == WLAN_EID_VENDOR_SPECIFIC && 1608 if (spos[0] == WLAN_EID_VENDOR_SPECIFIC &&
1602 !_wil_cfg80211_find_ie(ies1, ies1_len, spos, ielen)) { 1609 (!ies1 || !_wil_cfg80211_find_ie(ies1, ies1_len,
1610 spos, ielen))) {
1603 memcpy(dpos, spos, ielen); 1611 memcpy(dpos, spos, ielen);
1604 dpos += ielen; 1612 dpos += ielen;
1605 } 1613 }