From 3a53a1e3754df0e5d77a6549a620d570acacbae4 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Fri, 20 Jan 2012 18:05:36 -0800 Subject: Don't overwrite psUpperLayerContext when reconfiguring the SE. This fixes one of the crashes occuring when turning the screen off during p2p transfers. One remaining. Change-Id: I3e45be9b8f4be40350ba4dd9db7e596631206bd1 --- src/phHal4Nfc_Emulation.c | 4 -- src/phLibNfc_SE.c | 99 +++++++++++++++++++++++------------------------ 2 files changed, 49 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/phHal4Nfc_Emulation.c b/src/phHal4Nfc_Emulation.c index b231f1e..6bb60e2 100644 --- a/src/phHal4Nfc_Emulation.c +++ b/src/phHal4Nfc_Emulation.c @@ -140,8 +140,6 @@ NFCSTATUS phHal4Nfc_Switch_SMX_Mode( } else { - /* Register Upper layer context */ - Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext; /* Switch request to Wired mode */ if(eSmartMx_Wired == smx_mode) { @@ -270,8 +268,6 @@ NFCSTATUS phHal4Nfc_Switch_Swp_Mode( } else { - /* Register Upper layer context */ - Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext; /*Switch mode to On or off*/ CfgStatus = phHciNfc_Switch_SwpMode( Hal4Ctxt->psHciHandle, diff --git a/src/phLibNfc_SE.c b/src/phLibNfc_SE.c index 968c239..2cdb24e 100644 --- a/src/phLibNfc_SE.c +++ b/src/phLibNfc_SE.c @@ -665,81 +665,80 @@ NFCSTATUS phLibNfc_SE_SetMode ( phLibNfc_Handle hSE_Handle, */ STATIC void phLibNfc_SE_SetMode_cb(void *context, NFCSTATUS status) { - pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)context; + /* Note that we don't use the passed in context here; + * the reason is that there are race-conditions around + * the place where this context is stored (mostly in combination + * with LLCP), and we may actually get the wrong context. + * Since this callback always uses the global context + * we don't need the passed in context anyway. + */ + pphLibNfc_LibContext_t pLibContext=gpphLibContext; pphLibNfc_SE_SetModeRspCb_t pUpperLayerCb=NULL; void *pUpperContext=NULL; phLibNfc_Handle hSeHandle=0; uint8_t TempState=FALSE; - if(pLibContext != gpphLibContext) + if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) { - /*wrong context returned*/ - phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); + /*If shutdown is called in between allow shutdown to happen*/ + phLibNfc_Pending_Shutdown(); + status = NFCSTATUS_SHUTDOWN; } else { - if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) + if(status == NFCSTATUS_SUCCESS) { - /*If shutdown is called in between allow shutdown to happen*/ - phLibNfc_Pending_Shutdown(); - status = NFCSTATUS_SHUTDOWN; - } - else - { - if(status == NFCSTATUS_SUCCESS) - { - hSeHandle = pLibContext->sSeContext.hSetemp; + hSeHandle = pLibContext->sSeContext.hSetemp; - if(hSeHandle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) + if(hSeHandle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) + { + if(TRUE==pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc) { - if(TRUE==pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc) - { - /*If Activation mode was virtual allow external reader to see it*/ - pLibContext->sSeContext.uUiccActivate = TRUE; - sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = phLibNfc_SE_Active; - } - else - { - /*If Activation mode was wired don't allow external reader to see it*/ - pLibContext->sSeContext.uUiccActivate = FALSE; - sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = - phLibNfc_SE_Inactive; - } - status = NFCSTATUS_SUCCESS; - TempState = pLibContext->sSeContext.uUiccActivate; + /*If Activation mode was virtual allow external reader to see it*/ + pLibContext->sSeContext.uUiccActivate = TRUE; + sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = phLibNfc_SE_Active; } - else if (hSeHandle==sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) + else { - if(TRUE==pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation) - { - /*If Activation mode was virtual allow external reader to see it*/ - pLibContext->sSeContext.uSmxActivate = TRUE; - sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState = - phLibNfc_SE_Active; - } - else - { - /*If Activation mode was wired don't allow external reader to see it*/ - pLibContext->sSeContext.uSmxActivate = FALSE; - sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState= - phLibNfc_SE_Inactive; - } - status = NFCSTATUS_SUCCESS; - TempState = pLibContext->sSeContext.uSmxActivate; + /*If Activation mode was wired don't allow external reader to see it*/ + pLibContext->sSeContext.uUiccActivate = FALSE; + sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = + phLibNfc_SE_Inactive; + } + status = NFCSTATUS_SUCCESS; + TempState = pLibContext->sSeContext.uUiccActivate; + } + else if (hSeHandle==sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) + { + if(TRUE==pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation) + { + /*If Activation mode was virtual allow external reader to see it*/ + pLibContext->sSeContext.uSmxActivate = TRUE; + sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState = + phLibNfc_SE_Active; } else { - status = NFCSTATUS_FAILED; + /*If Activation mode was wired don't allow external reader to see it*/ + pLibContext->sSeContext.uSmxActivate = FALSE; + sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState= + phLibNfc_SE_Inactive; } + status = NFCSTATUS_SUCCESS; + TempState = pLibContext->sSeContext.uSmxActivate; } else { status = NFCSTATUS_FAILED; } - pLibContext->status.GenCb_pending_status = FALSE; } - + else + { + status = NFCSTATUS_FAILED; + } + pLibContext->status.GenCb_pending_status = FALSE; } + pUpperLayerCb = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb; pUpperContext = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt; pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = NULL; -- cgit v1.2.3