summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@codeaurora.org>2017-01-06 11:08:28 -0800
committerqcabuildsw <qcabuildsw@localhost>2017-01-12 02:19:28 -0800
commite2dc368517d2800b5b67ef8d2a435b8303f0ce10 (patch)
tree62dd1363851e428a14e059e36a0c71278d4c9ec0
parent1bd604262600dd2dc91540de6751eb729638bd9c (diff)
qcacld-3.0: Fix array out-of-bounds & integer underflow in _iw_set_genie
This is a qcacld-2.0 to qcacld-3.0 propagation. 'wrqu->data.length' holds the total number of IE data buffer. Add a check to make sure the number of remaining data to be read is greater than or equal to IE length. Also, advance the buffer pointer to point to the next element only if next element is present. Change-Id: Ic60f3e0650f365955dab4099eb8740e9789e00cc CRs-Fixed: 1100132
-rw-r--r--core/hdd/src/wlan_hdd_wext.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 03a9404e185b..1ea6f510e4af 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -3450,6 +3450,13 @@ static int __iw_set_genie(struct net_device *dev,
hdd_notice("IE[0x%X], LEN[%d]", elementId, eLen);
+ if (remLen < eLen) {
+ hdd_err("Remaining len: %u less than ie len: %u",
+ remLen, eLen);
+ ret = -EINVAL;
+ goto exit;
+ }
+
switch (elementId) {
case IE_EID_VENDOR:
if ((IE_LEN_SIZE + IE_EID_SIZE + IE_VENDOR_OUI_SIZE) > eLen) { /* should have at least OUI */
@@ -3529,8 +3536,11 @@ static int __iw_set_genie(struct net_device *dev,
hdd_err("Set UNKNOWN IE %X", elementId);
goto exit;
}
- genie += eLen;
remLen -= eLen;
+
+ /* Move genie only if next element is present */
+ if (remLen >= 2)
+ genie += eLen;
}
exit:
EXIT();