Fixed mac issues with smartcard context cleanup (#6890)
(cherry picked from commit b8a8ae4622
)
This commit is contained in:
Родитель
602fb7d788
Коммит
9ba06525d6
|
@ -180,6 +180,7 @@ void smartcard_context_free(void* pCtx)
|
|||
|
||||
/* cancel blocking calls like SCardGetStatusChange */
|
||||
SCardCancel(pContext->hContext);
|
||||
SCardReleaseContext(pContext->hContext);
|
||||
|
||||
if (MessageQueue_PostQuit(pContext->IrpQueue, 0) &&
|
||||
(WaitForSingleObject(pContext->thread, INFINITE) == WAIT_FAILED))
|
||||
|
@ -237,7 +238,7 @@ static void smartcard_release_all_contexts(SMARTCARD_DEVICE* smartcard)
|
|||
|
||||
/* Put thread to sleep so that PC/SC can process the cancel requests. This fixes a race
|
||||
* condition that sometimes caused the pc/sc daemon to crash on MacOS (_xpc_api_misuse) */
|
||||
Sleep(100);
|
||||
SleepEx(100, FALSE);
|
||||
|
||||
/**
|
||||
* Call SCardReleaseContext on remaining contexts and remove them from rgSCardContextList.
|
||||
|
@ -251,27 +252,7 @@ static void smartcard_release_all_contexts(SMARTCARD_DEVICE* smartcard)
|
|||
|
||||
for (index = 0; index < keyCount; index++)
|
||||
{
|
||||
pContext = (SMARTCARD_CONTEXT*)ListDictionary_Remove(smartcard->rgSCardContextList,
|
||||
(void*)pKeys[index]);
|
||||
|
||||
if (!pContext)
|
||||
continue;
|
||||
|
||||
hContext = pContext->hContext;
|
||||
|
||||
if (SCardIsValidContext(hContext) == SCARD_S_SUCCESS)
|
||||
{
|
||||
SCardReleaseContext(hContext);
|
||||
|
||||
if (MessageQueue_PostQuit(pContext->IrpQueue, 0) &&
|
||||
(WaitForSingleObject(pContext->thread, INFINITE) == WAIT_FAILED))
|
||||
WLog_ERR(TAG, "WaitForSingleObject failed with error %" PRIu32 "!",
|
||||
GetLastError());
|
||||
|
||||
CloseHandle(pContext->thread);
|
||||
MessageQueue_Free(pContext->IrpQueue);
|
||||
free(pContext);
|
||||
}
|
||||
ListDictionary_SetItemValue(smartcard->rgSCardContextList, (void*)pKeys[index], NULL);
|
||||
}
|
||||
|
||||
free(pKeys);
|
||||
|
|
Загрузка…
Ссылка в новой задаче