summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaresh Jayaram <njayar@codeaurora.org>2015-02-09 16:02:12 +0530
committerArne Coucheron <arco68@gmail.com>2015-03-04 01:25:20 +0100
commitaa0a2559c541108181858536b8883b2e439743e2 (patch)
tree3c791892c57cb49deb271efb1dbc857dab089cab
parentf624f39421073a0851749a8a72248442055c43cb (diff)
downloadandroid_hardware_qcom_wlan-staging/cm-12.1.tar.gz
android_hardware_qcom_wlan-staging/cm-12.1.tar.bz2
android_hardware_qcom_wlan-staging/cm-12.1.zip
wifihal: Replace strcpy, vsprintf and handle NULL ptr dereferencstaging/cm-12.1
strcpy() is not safe, instead use strlcpy() which will terminate the destination string with NULL character. vsprintf() is not safe, instead use vsnprintf() which have control over the number of bytes to be written to the output str or buffer. Avoid dereferencing the pointer before the NULL check. CRs-Fixed: 793085 Change-Id: I06218bf28e1c165932a7b4061128895bca66c527
-rw-r--r--qcwcn/wifi_hal/cpp_bindings.cpp16
-rw-r--r--qcwcn/wifi_hal/gscan_event_handler.cpp17
-rw-r--r--qcwcn/wifi_hal/llstats.cpp10
-rw-r--r--qcwcn/wifi_hal/wifi_hal.cpp26
4 files changed, 46 insertions, 23 deletions
diff --git a/qcwcn/wifi_hal/cpp_bindings.cpp b/qcwcn/wifi_hal/cpp_bindings.cpp
index ac7b1e0..87d6e86 100644
--- a/qcwcn/wifi_hal/cpp_bindings.cpp
+++ b/qcwcn/wifi_hal/cpp_bindings.cpp
@@ -39,11 +39,11 @@
#include "common.h"
#include "cpp_bindings.h"
-void appendFmt(char *buf, int &offset, const char *fmt, ...)
+void appendFmt(char *buf, size_t buf_len, int &offset, const char *fmt, ...)
{
va_list params;
va_start(params, fmt);
- offset += vsprintf(buf + offset, fmt, params);
+ offset += vsnprintf(buf + offset, buf_len - offset, fmt, params);
va_end(params);
}
@@ -504,24 +504,24 @@ void WifiEvent::log() {
char line[81];
int linelen = min(16, len - i);
int offset = 0;
- appendFmt(line, offset, "%02x", data[i]);
+ appendFmt(line, sizeof(line), offset, "%02x", data[i]);
for (int j = 1; j < linelen; j++) {
- appendFmt(line, offset, " %02x", data[i+j]);
+ appendFmt(line, sizeof(line), offset, " %02x", data[i+j]);
}
for (int j = linelen; j < 16; j++) {
- appendFmt(line, offset, " ");
+ appendFmt(line, sizeof(line), offset, " ");
}
line[23] = '-';
- appendFmt(line, offset, " ");
+ appendFmt(line, sizeof(line), offset, " ");
for (int j = 0; j < linelen; j++) {
if (isprint(data[i+j])) {
- appendFmt(line, offset, "%c", data[i+j]);
+ appendFmt(line, sizeof(line), offset, "%c", data[i+j]);
} else {
- appendFmt(line, offset, "-");
+ appendFmt(line, sizeof(line), offset, "-");
}
}
diff --git a/qcwcn/wifi_hal/gscan_event_handler.cpp b/qcwcn/wifi_hal/gscan_event_handler.cpp
index f970238..168a82f 100644
--- a/qcwcn/wifi_hal/gscan_event_handler.cpp
+++ b/qcwcn/wifi_hal/gscan_event_handler.cpp
@@ -1074,14 +1074,17 @@ int GScanCommandEventHandler::handleEvent(WifiEvent &event)
(*mHandler.on_significant_change)(reqId,
mSignificantChangeNumResults,
mSignificantChangeResults);
- /* Reset flag and num counter. */
- for (index = 0; index < mSignificantChangeNumResults; index++)
- {
- free(mSignificantChangeResults[index]);
- mSignificantChangeResults[index] = NULL;
+ if (mSignificantChangeResults) {
+ /* Reset flag and num counter. */
+ for (index = 0; index < mSignificantChangeNumResults;
+ index++)
+ {
+ free(mSignificantChangeResults[index]);
+ mSignificantChangeResults[index] = NULL;
+ }
+ free(mSignificantChangeResults);
+ mSignificantChangeResults = NULL;
}
- free(mSignificantChangeResults);
- mSignificantChangeResults = NULL;
mSignificantChangeNumResults = 0;
mSignificantChangeMoreData = false;
}
diff --git a/qcwcn/wifi_hal/llstats.cpp b/qcwcn/wifi_hal/llstats.cpp
index 1a53827..3175ec1 100644
--- a/qcwcn/wifi_hal/llstats.cpp
+++ b/qcwcn/wifi_hal/llstats.cpp
@@ -922,11 +922,8 @@ int LLStatsCommand::handleEvent(WifiEvent &event)
free(mResultsParams.radio_stat);
mResultsParams.radio_stat = NULL;
}
- if(mResultsParams.iface_stat)
- {
- free(mResultsParams.iface_stat);
- mResultsParams.iface_stat = NULL;
- }
+ free(mResultsParams.iface_stat);
+ mResultsParams.iface_stat = NULL;
}
}
}
@@ -990,7 +987,8 @@ int LLStatsCommand::handleEvent(WifiEvent &event)
}
memset(pIfaceStat, 0, resultsBufSize);
- memcpy ( pIfaceStat, mResultsParams.iface_stat , sizeof(wifi_iface_stat));
+ if(mResultsParams.iface_stat)
+ memcpy ( pIfaceStat, mResultsParams.iface_stat , sizeof(wifi_iface_stat));
wifi_peer_info *pPeerStats;
pIfaceStat->num_peers = numPeers;
diff --git a/qcwcn/wifi_hal/wifi_hal.cpp b/qcwcn/wifi_hal/wifi_hal.cpp
index 58af8a7..b9573e0 100644
--- a/qcwcn/wifi_hal/wifi_hal.cpp
+++ b/qcwcn/wifi_hal/wifi_hal.cpp
@@ -290,6 +290,15 @@ wifi_error wifi_initialize(wifi_handle *handle)
iface_handle = wifi_get_iface_handle((info->interfaces[0])->handle,
(info->interfaces[0])->name);
+ if (iface_handle == NULL) {
+ int i;
+ for (i = 0; i < info->num_interfaces; i++)
+ {
+ free(info->interfaces[i]);
+ }
+ ALOGE("%s no iface with %s\n", __func__, info->interfaces[0]->name);
+ return WIFI_ERROR_UNKNOWN;
+ }
ret = acquire_supported_features(iface_handle,
&info->supported_feature_set);
if (ret != WIFI_SUCCESS) {
@@ -574,7 +583,7 @@ static bool is_wifi_interface(const char *name)
static int get_interface(const char *name, interface_info *info)
{
- strcpy(info->name, name);
+ strlcpy(info->name, name, (IFNAMSIZ + 1));
info->id = if_nametoindex(name);
// ALOGI("found an interface : %s, id = %d", name, info->id);
return WIFI_SUCCESS;
@@ -606,6 +615,10 @@ wifi_error wifi_init_interfaces(wifi_handle handle)
return WIFI_ERROR_UNKNOWN;
info->interfaces = (interface_info **)malloc(sizeof(interface_info *) * n);
+ if (info->interfaces == NULL) {
+ ALOGE("%s: Error info->interfaces NULL", __func__);
+ return WIFI_ERROR_OUT_OF_MEMORY;
+ }
int i = 0;
while ((de = readdir(d))) {
@@ -614,6 +627,15 @@ wifi_error wifi_init_interfaces(wifi_handle handle)
if (is_wifi_interface(de->d_name)) {
interface_info *ifinfo
= (interface_info *)malloc(sizeof(interface_info));
+ if (ifinfo == NULL) {
+ ALOGE("%s: Error ifinfo NULL", __func__);
+ while (i > 0) {
+ free(info->interfaces[i-1]);
+ i--;
+ }
+ free(info->interfaces);
+ return WIFI_ERROR_OUT_OF_MEMORY;
+ }
if (get_interface(de->d_name, ifinfo) != WIFI_SUCCESS) {
free(ifinfo);
continue;
@@ -647,7 +669,7 @@ wifi_error wifi_get_iface_name(wifi_interface_handle handle, char *name,
size_t size)
{
interface_info *info = (interface_info *)handle;
- strcpy(name, info->name);
+ strlcpy(name, info->name, size);
return WIFI_SUCCESS;
}