summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJerry Lee <jerrylee@broadcom.com>2016-07-08 15:40:24 -0700
committerTasayco Loarte, VictorX <victorx.tasayco.loarte@intel.com>2016-09-26 11:21:12 +0100
commit0ec28577a581ee07c7e9586a019d05f856d39497 (patch)
tree398456ca21af663db4cbd76eca4b1455f52c52b1 /drivers
parent98d35527ca1d1b3f9fd68787cfbc9c8104fba7b9 (diff)
downloadx86-0ec28577a581ee07c7e9586a019d05f856d39497.tar.gz
net: wireless: bcmdhd: security vulnerability - protect array overflow in PNO
Protect array overflow in parsing PNO batching cmd Bug: 29009982 Bug: 31554728 Change-Id: I4e36f580336cacd6e3efcb8caf91eef33003753b Tracked-On: https://jira01.devtools.intel.com/browse/AW-1795 Signed-off-by: Jerry Lee <jerrylee@broadcom.com> Signed-off-by: Victor Tasayco Loarte <victorx.tasayco.loarte@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/bcmdhd/wl_android.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c
index 39c52dd23d10..de75a3c2ce55 100644
--- a/drivers/net/wireless/bcmdhd/wl_android.c
+++ b/drivers/net/wireless/bcmdhd/wl_android.c
@@ -685,8 +685,9 @@ wls_parse_batching_cmd(struct net_device *dev, char *command, int total_len)
" <> params\n", __FUNCTION__));
goto exit;
}
- while ((token2 = strsep(&pos2,
- PNO_PARAM_CHANNEL_DELIMETER)) != NULL) {
+
+ while ((token2 = strsep(&pos2, PNO_PARAM_CHANNEL_DELIMETER))
+ != NULL) {
if (token2 == NULL || !*token2)
break;
if (*token2 == '\0')
@@ -697,13 +698,20 @@ wls_parse_batching_cmd(struct net_device *dev, char *command, int total_len)
DHD_PNO(("band : %s\n",
(*token2 == 'A')? "A" : "B"));
} else {
+ if ((batch_params.nchan >= WL_NUMCHANNELS) ||
+ (i >= WL_NUMCHANNELS)) {
+ DHD_ERROR(("Too many nchan %d\n",
+ batch_params.nchan));
+ err = BCME_BUFTOOSHORT;
+ goto exit;
+ }
batch_params.chan_list[i++] =
- simple_strtol(token2, NULL, 0);
+ simple_strtol(token2, NULL, 0);
batch_params.nchan++;
- DHD_PNO(("channel :%d\n",
- batch_params.chan_list[i-1]));
+ DHD_PNO(("channel: %d\n",
+ batch_params.chan_list[i-1]));
}
- }
+ }
} else if (!strncmp(param, PNO_PARAM_RTT, strlen(PNO_PARAM_RTT))) {
batch_params.rtt = simple_strtol(value, NULL, 0);
DHD_PNO(("rtt : %d\n", batch_params.rtt));