summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSreenath Sharma <sreenath.sharma@broadcom.com>2016-04-28 18:05:57 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-04-28 18:05:57 +0000
commitd34510f3effdd3116a92526482bb768fc5aabdd9 (patch)
tree05b2dca29fe177ec09f17445e9a03e2e0214d327
parentc6c80bd196022c7804e5a947b9aeb5b2bfc4a6c2 (diff)
parent6af064b77bfdc84a6f425a7c9d0941fad11f4489 (diff)
downloadandroid_hardware_broadcom_wlan-d34510f3effdd3116a92526482bb768fc5aabdd9.tar.gz
android_hardware_broadcom_wlan-d34510f3effdd3116a92526482bb768fc5aabdd9.tar.bz2
android_hardware_broadcom_wlan-d34510f3effdd3116a92526482bb768fc5aabdd9.zip
WiFi HAL: memory leak fix
am: 6af064b * commit '6af064b77bfdc84a6f425a7c9d0941fad11f4489': WiFi HAL: memory leak fix Change-Id: I5972e88ee1516b1ab0716324acfe35e9afd2071e
-rw-r--r--bcmdhd/wifi_hal/common.cpp7
-rw-r--r--bcmdhd/wifi_hal/common.h8
-rw-r--r--bcmdhd/wifi_hal/gscan.cpp91
-rw-r--r--bcmdhd/wifi_hal/rtt.cpp29
-rw-r--r--bcmdhd/wifi_hal/wifi_hal.cpp32
-rw-r--r--bcmdhd/wifi_hal/wifi_logger.cpp107
-rw-r--r--bcmdhd/wifi_hal/wifi_offload.cpp6
7 files changed, 197 insertions, 83 deletions
diff --git a/bcmdhd/wifi_hal/common.cpp b/bcmdhd/wifi_hal/common.cpp
index f0184d6..69ed256 100644
--- a/bcmdhd/wifi_hal/common.cpp
+++ b/bcmdhd/wifi_hal/common.cpp
@@ -164,6 +164,9 @@ wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd)
ALOGV("Successfully added command %d: %p at %d", id, cmd, info->num_cmd);
info->num_cmd++;
result = WIFI_SUCCESS;
+ } else {
+ ALOGE("Failed to add command %d: %p at %d, reached max limit %d",
+ id, cmd, info->num_cmd, info->alloc_cmd);
}
return result;
@@ -187,6 +190,10 @@ WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id)
}
}
+ if (!cmd) {
+ ALOGI("Failed to remove command %d: %p", id, cmd);
+ }
+
return cmd;
}
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h
index 841f0f3..2967c97 100644
--- a/bcmdhd/wifi_hal/common.h
+++ b/bcmdhd/wifi_hal/common.h
@@ -245,5 +245,13 @@ wifi_error wifi_cancel_cmd(wifi_request_id id, wifi_interface_handle iface);
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))
+#define NULL_CHECK_RETURN(ptr, str, ret) \
+ do { \
+ if (!(ptr)) { \
+ ALOGE("%s(): null pointer - #ptr (%s)\n", __FUNCTION__, str); \
+ return ret; \
+ } \
+ } while (0)
+
#endif
diff --git a/bcmdhd/wifi_hal/gscan.cpp b/bcmdhd/wifi_hal/gscan.cpp
index 1dc5ec5..a0f9104 100644
--- a/bcmdhd/wifi_hal/gscan.cpp
+++ b/bcmdhd/wifi_hal/gscan.cpp
@@ -685,10 +685,17 @@ wifi_error wifi_start_gscan(
ALOGV("Starting GScan, halHandle = %p", handle);
ScanCommand *cmd = new ScanCommand(iface, id, &params, handler);
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
@@ -705,6 +712,7 @@ wifi_error wifi_stop_gscan(wifi_request_id id, wifi_interface_handle iface)
memset(&handler, 0, sizeof(handler));
ScanCommand *cmd = new ScanCommand(iface, id, &dummy_params, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -713,7 +721,6 @@ wifi_error wifi_stop_gscan(wifi_request_id id, wifi_interface_handle iface)
return wifi_cancel_cmd(id, iface);
}
-
wifi_error wifi_enable_full_scan_results(
wifi_request_id id,
wifi_interface_handle iface,
@@ -725,11 +732,17 @@ wifi_error wifi_enable_full_scan_results(
ALOGV("Enabling full scan results, halHandle = %p", handle);
FullScanResultsCommand *cmd = new FullScanResultsCommand(iface, id, &params_dummy, handler);
- wifi_register_cmd(handle, id, cmd);
-
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
@@ -790,6 +803,7 @@ wifi_error wifi_disable_full_scan_results(wifi_request_id id, wifi_interface_han
memset(&handler, 0, sizeof(handler));
FullScanResultsCommand *cmd = new FullScanResultsCommand(iface, 0, &params_dummy, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -964,8 +978,9 @@ wifi_error wifi_get_cached_gscan_results(wifi_interface_handle iface, byte flush
ALOGV("Getting cached scan results, iface handle = %p, num = %d", iface, *num);
GetScanResultsCommand *cmd = new GetScanResultsCommand(iface, flush, results, max, num);
- wifi_error err = (wifi_error) cmd->execute();
- delete cmd;
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error err = (wifi_error)cmd->execute();
+ cmd->releaseRef();
return err;
}
@@ -1343,10 +1358,17 @@ wifi_error wifi_set_bssid_hotlist(wifi_request_id id, wifi_interface_handle ifac
wifi_handle handle = getWifiHandle(iface);
BssidHotlistCommand *cmd = new BssidHotlistCommand(iface, id, params, handler);
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
@@ -1558,10 +1580,17 @@ wifi_error wifi_set_significant_change_handler(wifi_request_id id, wifi_interfac
SignificantWifiChangeCommand *cmd = new SignificantWifiChangeCommand(
iface, id, params, handler);
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
@@ -1579,6 +1608,7 @@ wifi_error wifi_reset_epno_list(wifi_request_id id, wifi_interface_handle iface)
memset(&handler, 0, sizeof(handler));
ePNOCommand *cmd = new ePNOCommand(iface, id, NULL, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -1589,15 +1619,22 @@ wifi_error wifi_reset_epno_list(wifi_request_id id, wifi_interface_handle iface)
wifi_error wifi_set_epno_list(wifi_request_id id, wifi_interface_handle iface,
const wifi_epno_params *params, wifi_epno_handler handler)
{
- wifi_handle handle = getWifiHandle(iface);
-
- ePNOCommand *cmd = new ePNOCommand(iface, id, params, handler);
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
- if (result != WIFI_SUCCESS) {
- wifi_unregister_cmd(handle, id);
- }
- return result;
+ wifi_handle handle = getWifiHandle(iface);
+
+ ePNOCommand *cmd = new ePNOCommand(iface, id, params, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
+ if (result != WIFI_SUCCESS) {
+ wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
+ }
+ return result;
}
class BssidBlacklistCommand : public WifiCommand
@@ -1670,6 +1707,7 @@ wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle if
wifi_handle handle = getWifiHandle(iface);
BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, &params);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
wifi_error result = (wifi_error)cmd->start();
//release the reference of command as well
cmd->releaseRef();
@@ -1836,10 +1874,17 @@ wifi_error wifi_set_passpoint_list(wifi_request_id id, wifi_interface_handle ifa
wifi_handle handle = getWifiHandle(iface);
AnqpoConfigureCommand *cmd = new AnqpoConfigureCommand(id, iface, num, networks, handler);
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
diff --git a/bcmdhd/wifi_hal/rtt.cpp b/bcmdhd/wifi_hal/rtt.cpp
index d88bc61..410196b 100644
--- a/bcmdhd/wifi_hal/rtt.cpp
+++ b/bcmdhd/wifi_hal/rtt.cpp
@@ -219,8 +219,7 @@ public:
: WifiCommand("EnableResponderCommand", iface, 0), mChannelInfo(channel_hint),
m_max_duration_sec(max_duration_seconds), mResponderInfo(responderInfo)
{
- memset(mResponderInfo, 0 , sizeof(*mResponderInfo));
-
+ memset(mResponderInfo, 0, sizeof(*mResponderInfo));
}
virtual int create() {
@@ -613,10 +612,20 @@ wifi_error wifi_rtt_range_request(wifi_request_id id, wifi_interface_handle ifac
unsigned num_rtt_config, wifi_rtt_config rtt_config[], wifi_rtt_event_handler handler)
{
wifi_handle handle = getWifiHandle(iface);
-
RttCommand *cmd = new RttCommand(iface, id, num_rtt_config, rtt_config, handler);
- wifi_register_cmd(handle, id, cmd);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
+ if (result != WIFI_SUCCESS) {
+ wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
+ }
+ return result;
}
/* API to cancel RTT measurements */
@@ -625,12 +634,10 @@ wifi_error wifi_rtt_range_cancel(wifi_request_id id, wifi_interface_handle ifac
{
wifi_handle handle = getWifiHandle(iface);
RttCommand *cmd = new RttCommand(iface, id);
- if (cmd) {
- cmd->cancel_specific(num_devices, addr);
- cmd->releaseRef();
- return WIFI_SUCCESS;
- }
- return WIFI_ERROR_INVALID_ARGS;
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ cmd->cancel_specific(num_devices, addr);
+ cmd->releaseRef();
+ return WIFI_SUCCESS;
}
/* API to get RTT capability */
diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp
index b925778..59c03c6 100644
--- a/bcmdhd/wifi_hal/wifi_hal.cpp
+++ b/bcmdhd/wifi_hal/wifi_hal.cpp
@@ -862,6 +862,7 @@ class AndroidPktFilterCommand : public WifiCommand {
int createSetPktFilterRequest(WifiRequest& request) {
u8 *program = new u8[mProgramLen];
+ NULL_CHECK_RETURN(program, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
int result = request.create(GOOGLE_OUI, APF_SUBCMD_SET_FILTER);
if (result < 0) {
return result;
@@ -1222,16 +1223,21 @@ static wifi_error wifi_start_rssi_monitoring(wifi_request_id id, wifi_interface_
ALOGD("Start RSSI monitor %d", id);
wifi_handle handle = getWifiHandle(iface);
SetRSSIMonitorCommand *cmd = new SetRSSIMonitorCommand(id, iface, max_rssi, min_rssi, eh);
- wifi_register_cmd(handle, id, cmd);
-
- wifi_error result = (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
if (result != WIFI_SUCCESS) {
wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
+ return result;
}
return result;
}
-
static wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_handle iface)
{
ALOGD("Stopping RSSI monitor");
@@ -1243,6 +1249,7 @@ static wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_h
memset(&handler, 0, sizeof(handler));
SetRSSIMonitorCommand *cmd = new SetRSSIMonitorCommand(id, iface,
max_rssi, min_rssi, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -1254,24 +1261,25 @@ static wifi_error wifi_get_packet_filter_capabilities(wifi_interface_handle hand
u32 *version, u32 *max_len)
{
ALOGD("Getting APF capabilities, halHandle = %p\n", handle);
- wifi_error Status = WIFI_SUCCESS;
-
AndroidPktFilterCommand *cmd = new AndroidPktFilterCommand(handle, version, max_len);
- Status = (wifi_error)cmd->start();
- if(Status == WIFI_SUCCESS) {
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ if (result == WIFI_SUCCESS) {
ALOGD("Getting APF capability, version = %d, max_len = %d\n", *version, *max_len);
}
- return Status;
+ cmd->releaseRef();
+ return result;
}
static wifi_error wifi_set_packet_filter(wifi_interface_handle handle,
const u8 *program, u32 len)
{
ALOGD("Setting APF program, halHandle = %p\n", handle);
- wifi_error Status = WIFI_SUCCESS;
-
AndroidPktFilterCommand *cmd = new AndroidPktFilterCommand(handle, program, len);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
static wifi_error wifi_configure_nd_offload(wifi_interface_handle handle, u8 enable)
diff --git a/bcmdhd/wifi_hal/wifi_logger.cpp b/bcmdhd/wifi_hal/wifi_logger.cpp
index f33d74f..f0dc326 100644
--- a/bcmdhd/wifi_hal/wifi_logger.cpp
+++ b/bcmdhd/wifi_hal/wifi_logger.cpp
@@ -387,7 +387,10 @@ wifi_error wifi_get_firmware_version(wifi_interface_handle iface, char *buffer,
{
if (buffer && (buffer_size > 0)) {
DebugCommand *cmd = new DebugCommand(iface, buffer, &buffer_size, GET_FW_VER);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
} else {
ALOGE("FW version buffer NULL");
return WIFI_ERROR_INVALID_ARGS;
@@ -399,7 +402,10 @@ wifi_error wifi_get_driver_version(wifi_interface_handle iface, char *buffer, in
{
if (buffer && (buffer_size > 0)) {
DebugCommand *cmd = new DebugCommand(iface, buffer, &buffer_size, GET_DRV_VER);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
} else {
ALOGE("Driver version buffer NULL");
return WIFI_ERROR_INVALID_ARGS;
@@ -410,7 +416,10 @@ wifi_error wifi_get_driver_version(wifi_interface_handle iface, char *buffer, in
wifi_error wifi_get_ring_data(wifi_interface_handle iface, char *ring_name)
{
DebugCommand *cmd = new DebugCommand(iface, ring_name, GET_RING_DATA);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
/* API to get the status of all ring buffers supported by driver */
@@ -419,7 +428,10 @@ wifi_error wifi_get_ring_buffers_status(wifi_interface_handle iface,
{
if (status && num_rings) {
DebugCommand *cmd = new DebugCommand(iface, num_rings, status, GET_RING_STATUS);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
} else {
ALOGE("Ring status buffer NULL");
return WIFI_ERROR_INVALID_ARGS;
@@ -432,7 +444,10 @@ wifi_error wifi_get_logger_supported_feature_set(wifi_interface_handle iface,
{
if (support) {
DebugCommand *cmd = new DebugCommand(iface, support, GET_FEATURE);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
} else {
ALOGE("Get support buffer NULL");
return WIFI_ERROR_INVALID_ARGS;
@@ -443,9 +458,12 @@ wifi_error wifi_start_logging(wifi_interface_handle iface, u32 verbose_level,
u32 flags, u32 max_interval_sec, u32 min_data_size, char *ring_name)
{
if (ring_name) {
- DebugCommand *cmd = new DebugCommand(iface, verbose_level, flags,
- max_interval_sec, min_data_size, ring_name, START_RING_LOG);
- return (wifi_error)cmd->start();
+ DebugCommand *cmd = new DebugCommand(iface, verbose_level, flags, max_interval_sec,
+ min_data_size, ring_name, START_RING_LOG);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
} else {
ALOGE("Ring name NULL");
return WIFI_ERROR_INVALID_ARGS;
@@ -544,16 +562,19 @@ wifi_error wifi_set_log_handler(wifi_request_id id, wifi_interface_handle iface,
ALOGV("Loghandler start, handle = %p", handle);
SetLogHandler *cmd = new SetLogHandler(iface, id, handler);
- if (cmd) {
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
- if (result != WIFI_SUCCESS)
- wifi_unregister_cmd(handle, id);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
+ if (result != WIFI_SUCCESS) {
+ wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
return result;
- } else {
- ALOGD("Out of memory");
- return WIFI_ERROR_OUT_OF_MEMORY;
}
+ return result;
}
wifi_error wifi_reset_log_handler(wifi_request_id id, wifi_interface_handle iface)
@@ -566,6 +587,7 @@ wifi_error wifi_reset_log_handler(wifi_request_id id, wifi_interface_handle ifac
memset(&handler, 0, sizeof(handler));
SetLogHandler *cmd = new SetLogHandler(iface, id, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -723,17 +745,19 @@ wifi_error wifi_set_alert_handler(wifi_request_id id, wifi_interface_handle ifac
ALOGV("Alerthandler start, handle = %p", handle);
SetAlertHandler *cmd = new SetAlertHandler(iface, id, handler);
-
- if (cmd) {
- wifi_register_cmd(handle, id, cmd);
- wifi_error result = (wifi_error)cmd->start();
- if (result != WIFI_SUCCESS)
- wifi_unregister_cmd(handle, id);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = wifi_register_cmd(handle, id, cmd);
+ if (result != WIFI_SUCCESS) {
+ cmd->releaseRef();
+ return result;
+ }
+ result = (wifi_error)cmd->start();
+ if (result != WIFI_SUCCESS) {
+ wifi_unregister_cmd(handle, id);
+ cmd->releaseRef();
return result;
- } else {
- ALOGE("Out of memory");
- return WIFI_ERROR_OUT_OF_MEMORY;
}
+ return result;
}
wifi_error wifi_reset_alert_handler(wifi_request_id id, wifi_interface_handle iface)
@@ -746,6 +770,7 @@ wifi_error wifi_reset_alert_handler(wifi_request_id id, wifi_interface_handle if
memset(&handler, 0, sizeof(handler));
SetAlertHandler *cmd = new SetAlertHandler(iface, id, handler);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
cmd->cancel();
cmd->releaseRef();
return WIFI_SUCCESS;
@@ -865,7 +890,10 @@ wifi_error wifi_get_firmware_memory_dump( wifi_interface_handle iface,
wifi_firmware_memory_dump_handler handler)
{
MemoryDumpCommand *cmd = new MemoryDumpCommand(iface, handler);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
class PacketFateCommand: public WifiCommand
@@ -995,14 +1023,14 @@ public:
ALOGI("Id = %0x, subcmd = %d, len = %d", id, subcmd, len);
if (mReqType == TX_PACKET_FATE) {
- ALOGI("Response Recieved for Get Tx Pkt Fate command\n");
+ ALOGI("Response recieved for get TX pkt fate command\n");
} else if (mReqType == RX_PACKET_FATE) {
- ALOGI("Response Recieved for Get Rx Pkt Fate command\n");
+ ALOGI("Response recieved for get RX pkt fate command\n");
} else if (mReqType == PACKET_MONITOR_START) {
- ALOGI("Response Recieved for Monitor Pkt Fate command\n");
+ ALOGI("Response recieved for monitor pkt fate command\n");
return NL_OK;
} else {
- ALOGE("Response Recieved for Unknown Pkt Fate command\n");
+ ALOGE("Response recieved for unknown pkt fate command\n");
return NL_SKIP;
}
@@ -1033,7 +1061,10 @@ public:
wifi_error wifi_start_pkt_fate_monitoring(wifi_interface_handle handle)
{
PacketFateCommand *cmd = new PacketFateCommand(handle);
- return (wifi_error)cmd->start();
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
wifi_error wifi_get_tx_pkt_fates(wifi_interface_handle handle,
@@ -1041,8 +1072,11 @@ wifi_error wifi_get_tx_pkt_fates(wifi_interface_handle handle,
size_t *n_provided_fates)
{
PacketFateCommand *cmd = new PacketFateCommand(handle, tx_report_bufs,
- n_requested_fates, n_provided_fates);
- return (wifi_error)cmd->start();
+ n_requested_fates, n_provided_fates);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
wifi_error wifi_get_rx_pkt_fates(wifi_interface_handle handle,
@@ -1050,6 +1084,9 @@ wifi_error wifi_get_rx_pkt_fates(wifi_interface_handle handle,
size_t *n_provided_fates)
{
PacketFateCommand *cmd = new PacketFateCommand(handle, rx_report_bufs,
- n_requested_fates, n_provided_fates);
- return (wifi_error)cmd->start();
+ n_requested_fates, n_provided_fates);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
+ wifi_error result = (wifi_error)cmd->start();
+ cmd->releaseRef();
+ return result;
}
diff --git a/bcmdhd/wifi_hal/wifi_offload.cpp b/bcmdhd/wifi_hal/wifi_offload.cpp
index 41cc13f..2dc9228 100644
--- a/bcmdhd/wifi_hal/wifi_offload.cpp
+++ b/bcmdhd/wifi_hal/wifi_offload.cpp
@@ -205,8 +205,9 @@ wifi_error wifi_start_sending_offloaded_packet(wifi_request_id index, wifi_inter
&& (ip_packet_len <= MKEEP_ALIVE_IP_PKT_MAX)) {
MKeepAliveCommand *cmd = new MKeepAliveCommand(iface, index, ip_packet, ip_packet_len,
src_mac_addr, dst_mac_addr, period_msec, START_MKEEP_ALIVE);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
wifi_error result = (wifi_error)cmd->start();
- delete cmd;
+ cmd->releaseRef();
return result;
} else {
ALOGE("Invalid mkeep_alive parameters");
@@ -219,8 +220,9 @@ wifi_error wifi_stop_sending_offloaded_packet(wifi_request_id index, wifi_interf
{
if (index > 0 && index <= N_AVAIL_ID) {
MKeepAliveCommand *cmd = new MKeepAliveCommand(iface, index, STOP_MKEEP_ALIVE);
+ NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
wifi_error result = (wifi_error)cmd->start();
- delete cmd;
+ cmd->releaseRef();
return result;
} else {
ALOGE("Invalid mkeep_alive parameters");