summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPoddar, Siddarth <siddpodd@codeaurora.org>2016-10-19 12:07:21 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-11-14 15:39:12 +0530
commit85e40ff4bf4fc96f021bcb908f99ffdef8112e5c (patch)
tree0cd856832483cbcf17a0eb4c8adaf7ea2a57ebc7
parenta5276a8155c5e7251b8cca658a8af66b9c27f9e3 (diff)
qcacld-2.0: Fix to avoid skb buff leak when NBUF alloc fail
If we fail to allocate receive packet bundle buffer it will return no memory without freeing receive pkt queue. Fix is to free the receive pkt queue before returning from message handler. Change-Id: I4bf2aeb7bc85cc68cfa1314e6dbf5057665ba7ce CRs-Fixed: 1079623
-rw-r--r--CORE/SERVICES/HIF/sdio/hif_sdio_recv.c13
-rw-r--r--CORE/SERVICES/HTC/htc.c18
2 files changed, 31 insertions, 0 deletions
diff --git a/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c b/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c
index bec447162b14..0e15fb768720 100644
--- a/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c
+++ b/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c
@@ -39,6 +39,7 @@
#include <adf_os_defer.h>
#include <adf_os_atomic.h>
#include <adf_nbuf.h>
+#include <vos_threads.h>
#include <athdefs.h>
#include <adf_net_types.h>
#include <a_types.h>
@@ -51,6 +52,7 @@
#include "regtable.h"
#include "if_ath_sdio.h"
+#define NBUF_ALLOC_FAIL_WAIT_TIME 100
static void HIFDevDumpRegisters(HIF_SDIO_DEVICE *pDev,
MBOX_IRQ_PROC_REGISTERS *pIrqProcRegs,
@@ -645,6 +647,7 @@ static A_STATUS HIFDevIssueRecvPacketBundle(HIF_SDIO_DEVICE *pDev,
if (!pPacketRxBundle) {
AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: pPacketRxBundle is NULL \n",
__FUNCTION__));
+ vos_sleep(NBUF_ALLOC_FAIL_WAIT_TIME); /* 100 msec sleep */
return A_NO_MEMORY;
}
pBundleBuffer = pPacketRxBundle->pBuffer;
@@ -823,6 +826,16 @@ A_STATUS HIFDevRecvMessagePendingHandler(HIF_SDIO_DEVICE *pDev,
&pktsFetched,
partialBundle);
if (A_FAILED(status)) {
+ while (!HTC_QUEUE_EMPTY(&recvPktQueue)) {
+ adf_nbuf_t netbuf;
+
+ pPacket = HTC_PACKET_DEQUEUE(&recvPktQueue);
+ if (pPacket == NULL)
+ break;
+ netbuf = (adf_nbuf_t) pPacket->pNetBufContext;
+ if (netbuf)
+ adf_nbuf_free(netbuf);
+ }
break;
}
diff --git a/CORE/SERVICES/HTC/htc.c b/CORE/SERVICES/HTC/htc.c
index 0600149dc55a..e876bf0725d3 100644
--- a/CORE/SERVICES/HTC/htc.c
+++ b/CORE/SERVICES/HTC/htc.c
@@ -36,6 +36,8 @@
#include "epping_main.h"
#include "htc_api.h"
+#define MAX_HTC_RX_BUNDLE 2
+
#ifdef WLAN_DEBUG
static ATH_DEBUG_MASK_DESCRIPTION g_HTCDebugDescription[] = {
{ ATH_DEBUG_SEND , "Send"},
@@ -534,6 +536,8 @@ A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
HTC_SERVICE_CONNECT_RESP resp;
HTC_READY_MSG *rdy_msg;
A_UINT16 htc_rdy_msg_id;
+ A_UINT8 i = 0;
+ HTC_PACKET *pRxBundlePacket, *pTempBundlePacket;
AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Enter (target:0x%p) \n", HTCHandle));
AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("+HWT\n"));
@@ -588,6 +592,20 @@ A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
status = A_ECOMM;
break;
}
+
+ /* Allocate expected number of RX bundle buffer allocation */
+ pTempBundlePacket = NULL;
+ for (i = 0; i < MAX_HTC_RX_BUNDLE; i++) {
+ pRxBundlePacket = AllocateHTCBundleRxPacket(target);
+ if (pRxBundlePacket != NULL) {
+ pRxBundlePacket->ListLink.pNext = (DL_LIST *)pTempBundlePacket;
+ } else {
+ break;
+ }
+ pTempBundlePacket = pRxBundlePacket;
+ }
+ target->pBundleFreeRxList = pTempBundlePacket;
+
/* done processing */
target->CtrlResponseProcessing = FALSE;