summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 35e8072e520b..ab7d9b5cbec0 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -13952,8 +13952,10 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy,
struct hdd_chain_rssi_context *context;
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
eHalStatus status;
- int retval = 0;
+ int retval;
unsigned long rc;
+ const int mac_len = sizeof(req_msg.peer_macaddr);
+ int msg_len;
ENTER();
@@ -13961,9 +13963,11 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy,
if (0 != retval)
return retval;
- if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, NULL)) {
+ /* nla validation doesn't do exact lengths, do the validation later */
+ retval = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, NULL);
+ if (retval) {
hddLog(LOGE, FL("Invalid ATTR"));
- return -EINVAL;
+ return retval;
}
if (!tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]) {
@@ -13971,9 +13975,15 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy,
return -EINVAL;
}
+ msg_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]);
+ if (msg_len != mac_len) {
+ hddLog(LOGE, FL("Invalid mac address length: %d, expected %d"),
+ msg_len, mac_len);
+ return -ERANGE;
+ }
+
memcpy(&req_msg.peer_macaddr,
- nla_data(tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]),
- sizeof(req_msg.peer_macaddr));
+ nla_data(tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]), mac_len);
spin_lock(&hdd_context_lock);
context = &hdd_ctx->chain_rssi_context;