wlan: Fix crash in fw logging
If wlanLoggingEnable ini param is disabled,logger infrastructure
is not initialized. Then a crash is possible when gwlan_logging
structure is accessed. Thus, enable checks in __vos_fatal_event_logs_req
and fatal log indication from fw to check for wlanLoggingEnable.
Change-Id: I3c705a98796641b9cc34402a44d0b1b743547653
CRs-fixed: 1035040
diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
index d9b21e8..b19bd42 100644
--- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c
+++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
@@ -1857,7 +1857,8 @@
}
if ((type == WLAN_FW_LOGS) && reason_code &&
- vos_isFatalEventEnabled())
+ vos_isFatalEventEnabled() &&
+ vos_is_wlan_logging_enabled())
{
if(wlan_is_log_report_in_progress() == TRUE)
{
@@ -1904,7 +1905,7 @@
wake_up_interruptible(&gwlan_logging.wait_queue);
}
}
- if(type == WLAN_FW_MEMORY_DUMP)
+ if(type == WLAN_FW_MEMORY_DUMP && vos_is_wlan_logging_enabled())
{
pr_info("%s: Setting FW MEM DUMP LOGGER event\n", __func__);
set_bit(LOGGER_FW_MEM_DUMP_PKT_POST_DONE, &gwlan_logging.event_flag);
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index 7f4fc05..dadb57e 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -504,4 +504,5 @@
void vos_probe_threads(void);
void vos_per_pkt_stats_to_user(void *perPktStat);
void vos_updatePktStatsInfo(void * pktStat);
+bool vos_is_wlan_logging_enabled(void);
#endif // if !defined __VOS_NVITEM_H
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 3bd3869..a97dcb3 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -1812,20 +1812,27 @@
{
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
"%s: vos context is Invalid", __func__);
- return eHAL_STATUS_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, vos_context );
if(!pHddCtx) {
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
"%s: HDD context is Null", __func__);
- return eHAL_STATUS_FAILURE;
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if(!pHddCtx->cfg_ini->wlanLoggingEnable)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s: Wlan logging not enabled", __func__);
+ return VOS_STATUS_E_FAILURE;
}
if(!pHddCtx->cfg_ini->enableFatalEvent)
{
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
"%s: Fatal event not enabled", __func__);
- return eHAL_STATUS_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
if (pHddCtx->isLoadUnloadInProgress ||
@@ -1833,7 +1840,7 @@
{
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
"%s: un/Load/SSR in progress", __func__);
- return eHAL_STATUS_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
if (vos_is_log_report_in_progress() == true)
@@ -3484,3 +3491,31 @@
value = wlan_isPktStatsEnabled();
return (value);
}
+
+bool vos_is_wlan_logging_enabled(void)
+{
+ v_CONTEXT_t vos_ctx = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ hdd_context_t *hdd_ctx;
+
+ if(!vos_ctx)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,"%s: Global VOS context is Null", __func__);
+ return false;
+ }
+
+ hdd_ctx = vos_get_context(VOS_MODULE_ID_HDD, vos_ctx);
+
+ if(!hdd_ctx)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,"%s: HDD context is Null", __func__);
+ return false;
+ }
+
+ if (!hdd_ctx->cfg_ini->wlanLoggingEnable)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,"%s: Logging framework not enabled!", __func__);
+ return false;
+ }
+
+ return true;
+}