aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@codeaurora.org>2016-12-12 18:45:32 -0800
committerJoey Rizzoli <joey@lineageos.org>2017-06-14 23:00:21 +0200
commit262196005747d5e8b4106e92adae3749e8686240 (patch)
treea150f635716ee7ad6a1616443179b805f693bbbf
parent8e0949b61f89df3372c37d76abd28cfc8015e155 (diff)
prima: Fix array out-of-bounds & integer underflow in _iw_set_genie
'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--drivers/staging/prima/CORE/HDD/src/wlan_hdd_wext.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/staging/prima/CORE/HDD/src/wlan_hdd_wext.c b/drivers/staging/prima/CORE/HDD/src/wlan_hdd_wext.c
index e21df64807e..4866296540f 100644
--- a/drivers/staging/prima/CORE/HDD/src/wlan_hdd_wext.c
+++ b/drivers/staging/prima/CORE/HDD/src/wlan_hdd_wext.c
@@ -2390,6 +2390,13 @@ static int __iw_set_genie(struct net_device *dev,
hddLog(VOS_TRACE_LEVEL_INFO, "%s: IE[0x%X], LEN[%d]",
__func__, elementId, eLen);
+ if (remLen < eLen) {
+ hddLog(LOGE, "Remaining len: %u less than ie len: %u",
+ remLen, eLen);
+ ret = -EINVAL;
+ goto exit;
+ }
+
switch ( elementId )
{
case IE_EID_VENDOR:
@@ -2472,8 +2479,11 @@ static int __iw_set_genie(struct net_device *dev,
hddLog (LOGE, "%s Set UNKNOWN IE %X",__func__, elementId);
goto exit;
}
- genie += eLen;
remLen -= eLen;
+
+ /* Move genie only if next element is present */
+ if (remLen >= 2)
+ genie += eLen;
}
exit: