wlan: Protect nl80211 vendor commands from SSR
Protect nl80211 vendor commands from accessing deallocated
and unitialized data structures while SSR is in progress.
Change-Id: I8983cacc86e02389521679c86f1d7869dd3510a3
CRs-Fixed: 787916
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 1965abf..d99d4be 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -379,6 +379,8 @@
struct sk_buff* skb;
hdd_adapter_t* pMonAdapter = NULL;
struct ieee80211_hdr *hdr;
+ hdd_context_t *pHddCtx;
+ int ret = 0;
if (pAdapter == NULL)
{
@@ -387,7 +389,14 @@
VOS_ASSERT(0);
return;
}
-
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ ret = wlan_hdd_validate_context(pHddCtx);
+ if (0 != ret)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: HDD context is not valid, ret =%d",__func__, ret);
+ return;
+ }
pMonAdapter = hdd_get_adapter( pAdapter->pHddCtx, WLAN_HDD_MONITOR );
if (pMonAdapter == NULL)
{
@@ -473,12 +482,19 @@
return;
}
-void hdd_mon_tx_work_queue(struct work_struct *work)
+void __hdd_mon_tx_work_queue(struct work_struct *work)
{
hdd_adapter_t* pAdapter = container_of(work, hdd_adapter_t, monTxWorkQueue);
hdd_mon_tx_mgmt_pkt(pAdapter);
}
+void hdd_mon_tx_work_queue(struct work_struct *work)
+{
+ vos_ssr_protect(__func__);
+ __hdd_mon_tx_work_queue(work);
+ vos_ssr_unprotect(__func__);
+}
+
int hdd_mon_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
v_U16_t rt_hdr_len;