Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e417799 authored by sheenam monga's avatar sheenam monga
Browse files

wlan: Allocate memory dynamically for SmeDisassocRsp and roamInfo

Currently Big structures SmeDisassocRsp and roamInfo are not
allocated from heap and increased stack size may cause stack
corrpution.

Fix is to allocate big structers dynamically instead of using
stack.

Change-Id: Id726ddb31856875551589de2fed0e21fb41cee0e
CRs-Fixed: 2633433
parent a3a3f410
Loading
Loading
Loading
Loading
+98 −47
Original line number Original line Diff line number Diff line
@@ -4651,7 +4651,7 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
    eCsrJoinState eRoamState = eCsrStopRoaming;
    eCsrJoinState eRoamState = eCsrStopRoaming;
    tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
    tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
    tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
    tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
    tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
    tCsrRoamInfo *roamInfo, *pRoamInfo = NULL;
#ifndef WLAN_MDM_CODE_REDUCTION_OPT
#ifndef WLAN_MDM_CODE_REDUCTION_OPT
    v_U8_t acm_mask = 0;
    v_U8_t acm_mask = 0;
#endif 
#endif 
@@ -4666,13 +4666,20 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
        return (eCsrStopRoaming);
        return (eCsrStopRoaming);
    }
    }
    roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
    if (!roamInfo) {
        smsLog(pMac, LOGE, FL("roamInfo empty"));
        return (eCsrStopRoaming);
    }
    do  
    do  
    {
    {
        // Check for Cardbus eject condition, before trying to Roam to any BSS
        // Check for Cardbus eject condition, before trying to Roam to any BSS
        //***if( !balIsCardPresent(pAdapter) ) break;
        //***if( !balIsCardPresent(pAdapter) ) break;
        
        
        vos_mem_set(&roamInfo, sizeof(roamInfo), 0);
        vos_mem_copy (roamInfo->bssid, &pSession->joinFailStatusCode.bssId,
        vos_mem_copy (&roamInfo.bssid, &pSession->joinFailStatusCode.bssId, sizeof(tSirMacAddr));
                      sizeof(tSirMacAddr));
        if(NULL != pBSSList)
        if(NULL != pBSSList)
        {
        {
            // When handling AP's capability change, continue to associate to
            // When handling AP's capability change, continue to associate to
@@ -4697,11 +4704,13 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
                    else
                    else
                    {
                    {
                        //We need to indicate to HDD that we are done with this one.
                        //We need to indicate to HDD that we are done with this one.
                        //vos_mem_set(&roamInfo, sizeof(tCsrRoamInfo), 0);
                        //this shall not be NULL
                        roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;     //this shall not be NULL
                        roamInfo->pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
                        roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
                        roamInfo->statusCode =
                        roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
                                     pSession->joinFailStatusCode.statusCode;
                        pRoamInfo = &roamInfo;
                        roamInfo->reasonCode =
                                     pSession->joinFailStatusCode.reasonCode;
                        pRoamInfo = roamInfo;
                    }
                    }
                }
                }
                while(pCommand->u.roamCmd.pRoamBssEntry)
                while(pCommand->u.roamCmd.pRoamBssEntry)
@@ -4786,7 +4795,7 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
                csrSetAbortRoamingCommand(pMac, pCommand);
                csrSetAbortRoamingCommand(pMac, pCommand);
                break;
                break;
            }
            }
            vos_mem_set(&roamInfo, sizeof(roamInfo), 0);
            vos_mem_set(roamInfo, sizeof(roamInfo), 0);
            if(pScanResult)
            if(pScanResult)
            {
            {
                tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
                tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
@@ -4797,8 +4806,8 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
                    eRoamState = eCsrStopRoaming;
                    eRoamState = eCsrStopRoaming;
                    break;
                    break;
                }
                }
                roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
                roamInfo->pBssDesc = &pScanResult->Result.BssDescriptor;
                pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
                pCommand->u.roamCmd.pLastRoamBss = roamInfo->pBssDesc;
                //No need to put uapsd_mask in if the BSS doesn't support uAPSD
                //No need to put uapsd_mask in if the BSS doesn't support uAPSD
                if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
                if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
                    CSR_IS_QOS_BSS(pIesLocal) &&
                    CSR_IS_QOS_BSS(pIesLocal) &&
@@ -4822,10 +4831,12 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
            {
            {
                pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
                pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
            }
            }
            roamInfo.pProfile = pProfile;
            roamInfo->pProfile = pProfile;
            pSession->bRefAssocStartCnt++;
            pSession->bRefAssocStartCnt++;
            csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
            csrRoamCallCallback(pMac, sessionId, roamInfo,
                                 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
                                pCommand->u.roamCmd.roamId,
                                eCSR_ROAM_ASSOCIATION_START,
                                eCSR_ROAM_RESULT_NONE );
        }
        }
        if ( NULL == pCommand->u.roamCmd.pRoamBssEntry ) 
        if ( NULL == pCommand->u.roamCmd.pRoamBssEntry ) 
        {
        {
@@ -4929,13 +4940,14 @@ static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand,
        {
        {
            pSession->bRefAssocStartCnt--;
            pSession->bRefAssocStartCnt--;
            //Complete the last association attemp because a new one is about to be tried
            //Complete the last association attemp because a new one is about to be tried
            pRoamInfo = &roamInfo;
            pRoamInfo = roamInfo;
            csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId, 
            csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId, 
                                        eCSR_ROAM_ASSOCIATION_COMPLETION, 
                                        eCSR_ROAM_ASSOCIATION_COMPLETION, 
                                        eCSR_ROAM_RESULT_NOT_ASSOCIATED);
                                        eCSR_ROAM_RESULT_NOT_ASSOCIATED);
        }
        }
    }
    }
    vos_mem_free(roamInfo);
    return( eRoamState );
    return( eRoamState );
}
}
@@ -5058,7 +5070,7 @@ eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pComma
eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
{
{
    eHalStatus status = eHAL_STATUS_SUCCESS;
    eHalStatus status = eHAL_STATUS_SUCCESS;
    tCsrRoamInfo roamInfo;
    tCsrRoamInfo *roamInfo;
    tANI_U32 sessionId = pCommand->sessionId;
    tANI_U32 sessionId = pCommand->sessionId;
    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
@@ -5067,6 +5079,7 @@ eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
        smsLog(pMac, LOGE, FL("  session %d not found "), sessionId);
        smsLog(pMac, LOGE, FL("  session %d not found "), sessionId);
        return eHAL_STATUS_FAILURE;
        return eHAL_STATUS_FAILURE;
    }
    }
    smsLog(pMac, LOG1, FL("Roam Reason : %d, sessionId: %d"),
    smsLog(pMac, LOG1, FL("Roam Reason : %d, sessionId: %d"),
                         pCommand->u.roamCmd.roamReason, sessionId);
                         pCommand->u.roamCmd.roamReason, sessionId);
    switch ( pCommand->u.roamCmd.roamReason )
    switch ( pCommand->u.roamCmd.roamReason )
@@ -5106,15 +5119,24 @@ eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
            }
            }
            else
            else
            {
            {
                roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
                roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
                csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
                if (!roamInfo) {
                   smsLog(pMac, LOGE, FL("roamInfo empty"));
                   return eHAL_STATUS_FAILURE;
                }
                roamInfo->reasonCode = eCsrRoamReasonStaCapabilityChanged;
                csrRoamCallCallback(pMac, pSession->sessionId, roamInfo, 0,
                                    eCSR_ROAM_ROAMING_START,
                                    eCSR_ROAM_RESULT_NONE);
                pSession->roamingReason = eCsrReassocRoaming;
                pSession->roamingReason = eCsrReassocRoaming;
                roamInfo.pBssDesc = pSession->pConnectBssDesc;
                roamInfo->pBssDesc = pSession->pConnectBssDesc;
                roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
                roamInfo->pProfile = &pCommand->u.roamCmd.roamProfile;
                pSession->bRefAssocStartCnt++;
                pSession->bRefAssocStartCnt++;
                csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
                csrRoamCallCallback(pMac, sessionId, roamInfo, pCommand->u.roamCmd.roamId,
                                     eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
                                     eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
   
   
                vos_mem_free(roamInfo);
                smsLog(pMac, LOG1, FL("  calling csrRoamIssueReassociate"));
                smsLog(pMac, LOG1, FL("  calling csrRoamIssueReassociate"));
                status = csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
                status = csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
                                                  &pCommand->u.roamCmd.roamProfile );
                                                  &pCommand->u.roamCmd.roamProfile );
@@ -5207,6 +5229,7 @@ eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
        }
        }
        break;
        break;
    }
    }
    return (status);
    return (status);
}
}
@@ -8675,7 +8698,7 @@ void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisass
    tScanResultHandle hBSSList;
    tScanResultHandle hBSSList;
    tANI_BOOLEAN fCallCallback, fRemoveCmd;
    tANI_BOOLEAN fCallCallback, fRemoveCmd;
    eHalStatus status;
    eHalStatus status;
    tCsrRoamInfo roamInfo;
    tCsrRoamInfo *roamInfo;
    tCsrScanResultFilter *pScanFilter = NULL;
    tCsrScanResultFilter *pScanFilter = NULL;
    tANI_U32 roamId = 0;
    tANI_U32 roamId = 0;
    tCsrRoamProfile *pCurRoamProfile = NULL;
    tCsrRoamProfile *pCurRoamProfile = NULL;
@@ -8684,13 +8707,19 @@ void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisass
#endif
#endif
    tANI_U32 sessionId;
    tANI_U32 sessionId;
    tCsrRoamSession *pSession = NULL;
    tCsrRoamSession *pSession = NULL;
    tSirSmeDisassocRsp *SmeDisassocRsp = NULL;
    tSirSmeDisassocRsp SmeDisassocRsp;
    SmeDisassocRsp = vos_mem_malloc(sizeof(tSirSmeDisassocRsp));
    if (!SmeDisassocRsp) {
	   smsLog(pMac, LOGE, FL("SmeDisassocRsp empty"));
           return;
    }
    csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
    csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, SmeDisassocRsp);
    sessionId = SmeDisassocRsp.sessionId;
    sessionId = SmeDisassocRsp->sessionId;
    statusCode = SmeDisassocRsp.statusCode;
    statusCode = SmeDisassocRsp->statusCode;
    vos_mem_free(SmeDisassocRsp);
    smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d", sessionId);
    smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d", sessionId);
    if ( csrIsConnStateInfra( pMac, sessionId ) )
    if ( csrIsConnStateInfra( pMac, sessionId ) )
@@ -8806,16 +8835,23 @@ void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisass
            smsLog( pMac, LOGE, "%s: NO commands are active", __func__ );
            smsLog( pMac, LOGE, "%s: NO commands are active", __func__ );
        }
        }
        roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
        if (!roamInfo) {
          smsLog(pMac, LOGE, FL("roamInfo empty"));
          goto POST_ROAM_FAILURE;
        }
        /* Notify HDD about handoff and provide the BSSID too */
        /* Notify HDD about handoff and provide the BSSID too */
        roamInfo.reasonCode = eCsrRoamReasonBetterAP;
        roamInfo->reasonCode = eCsrRoamReasonBetterAP;
        vos_mem_copy(roamInfo.bssid,
        vos_mem_copy(roamInfo->bssid,
                     pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid,
                     pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid,
                     sizeof(tSirMacAddr));
                     sizeof(tSirMacAddr));
        csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, 
        csrRoamCallCallback(pMac, sessionId, roamInfo, 0,
                            eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
                            eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
        vos_mem_free(roamInfo);
        /* Copy the connected profile to apply the same for this connection as well */
        /* Copy the connected profile to apply the same for this connection as well */
        pCurRoamProfile = vos_mem_malloc(sizeof(tCsrRoamProfile));
        pCurRoamProfile = vos_mem_malloc(sizeof(tCsrRoamProfile));
        if ( pCurRoamProfile != NULL )
        if ( pCurRoamProfile != NULL )
@@ -8853,11 +8889,17 @@ void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisass
        if (pCurRoamProfile)
        if (pCurRoamProfile)
            vos_mem_free(pCurRoamProfile);
            vos_mem_free(pCurRoamProfile);
        roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
        if (!roamInfo) {
          smsLog(pMac, LOGE, FL("roamInfo empty"));
          return;
        }
        /* Inform the upper layers that the reassoc failed */
        /* Inform the upper layers that the reassoc failed */
        vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
        csrRoamCallCallback(pMac, sessionId, roamInfo, 0,
        csrRoamCallCallback(pMac, sessionId,
                            eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
                &roamInfo, 0, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
        vos_mem_free(roamInfo);
        /* 
        /* 
         * Issue a disassoc request so that PE/LIM uses this to clean-up the FT session.
         * Issue a disassoc request so that PE/LIM uses this to clean-up the FT session.
         * Upon success, we would re-enter this routine after receiving the disassoc
         * Upon success, we would re-enter this routine after receiving the disassoc
@@ -8959,7 +9001,7 @@ void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
{
{
    tSirSmeRsp *pSmeRsp;
    tSirSmeRsp *pSmeRsp;
    tSmeIbssPeerInd *pIbssPeerInd;
    tSmeIbssPeerInd *pIbssPeerInd;
    tCsrRoamInfo roamInfo;
    tCsrRoamInfo *roamInfo;
        // TODO Session Id need to be acquired in this function
        // TODO Session Id need to be acquired in this function
        tANI_U32 sessionId = 0;
        tANI_U32 sessionId = 0;
    pSmeRsp = (tSirSmeRsp *)pMsgBuf;
    pSmeRsp = (tSirSmeRsp *)pMsgBuf;
@@ -9046,26 +9088,35 @@ void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
        case eWNI_SME_IBSS_PEER_DEPARTED_IND:
        case eWNI_SME_IBSS_PEER_DEPARTED_IND:
            pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
            pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
            smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state");
            smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state");
            vos_mem_set(&roamInfo, sizeof(tCsrRoamInfo), 0);
            roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
            roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
            if (!roamInfo) {
            roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
                   smsLog(pMac, LOGE, FL("roamInfo empty"));
            roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
                   return;
            vos_mem_copy(&roamInfo.peerMac, pIbssPeerInd->peerAddr,
            }
            roamInfo->staId = (tANI_U8)pIbssPeerInd->staId;
            roamInfo->ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
            roamInfo->bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
            vos_mem_copy(roamInfo->peerMac, pIbssPeerInd->peerAddr,
                         sizeof(tCsrBssid));
                         sizeof(tCsrBssid));
            csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, 
            csrRoamCallCallback(pMac, sessionId, roamInfo, 0,
                                eCSR_ROAM_CONNECT_STATUS_UPDATE, 
                                eCSR_ROAM_CONNECT_STATUS_UPDATE, 
                                eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
                                eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
            vos_mem_free(roamInfo);
            break;
            break;
        case eWNI_SME_LOST_LINK_PARAMS_IND:
        case eWNI_SME_LOST_LINK_PARAMS_IND:
            {
            {
                tpSirSmeLostLinkParamsInd pLostLinkParamsInd = (tpSirSmeLostLinkParamsInd)pSmeRsp;
                tpSirSmeLostLinkParamsInd pLostLinkParamsInd = (tpSirSmeLostLinkParamsInd)pSmeRsp;
                tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
                eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
                eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
                vos_mem_set(&roamInfo, sizeof(tCsrRoamInfo), 0);
                roamInfo = vos_mem_malloc(sizeof(tCsrRoamInfo));
                roamInfo.u.pLostLinkParams = &pLostLinkParamsInd->info;
                if (!roamInfo) {
                pRoamInfo = &roamInfo;
                     smsLog(pMac, LOGE, FL("roamInfo empty"));
                     return;
                }
                roamInfo->u.pLostLinkParams = &pLostLinkParamsInd->info;
                csrRoamCallCallback(pMac, pLostLinkParamsInd->sessionId,
                csrRoamCallCallback(pMac, pLostLinkParamsInd->sessionId,
                               pRoamInfo, 0, eCSR_ROAM_LOST_LINK_PARAMS_IND, result);
                                    roamInfo, 0, eCSR_ROAM_LOST_LINK_PARAMS_IND,
                                    result);
                vos_mem_free(roamInfo);
                break;
                break;
            }
            }
        case eWNI_SME_TRIGGER_SAE:
        case eWNI_SME_TRIGGER_SAE: