[emu,scard] abort busy loop on session cancel

This commit is contained in:
Armin Novak 2024-04-05 11:41:32 +02:00 committed by akallabeth
parent 330fe90b21
commit 8b2e13d989

View File

@ -19,6 +19,7 @@
*/
#include <freerdp/config.h>
#include <freerdp/freerdp.h>
#include <winpr/crt.h>
#include <winpr/wlog.h>
@ -1362,6 +1363,10 @@ LONG WINAPI Emulate_SCardGetStatusChangeA(SmartcardEmulationContext* smartcard,
SCardContext* value = HashTable_GetItemValue(smartcard->contexts, (const void*)hContext);
WINPR_ASSERT(value); /* Must be valid after Emulate_SCardIsValidContext */
freerdp* inst =
freerdp_settings_get_pointer_writable(smartcard->settings, FreeRDP_instance);
WINPR_ASSERT(inst);
status = SCARD_E_TIMEOUT;
do
{
@ -1410,6 +1415,11 @@ LONG WINAPI Emulate_SCardGetStatusChangeA(SmartcardEmulationContext* smartcard,
Sleep(diff);
if (dwTimeout != INFINITE)
dwTimeout -= MIN(dwTimeout, diff);
if (freerdp_shall_disconnect_context(inst->context))
{
status = SCARD_E_CANCELLED;
break;
}
} while (dwTimeout > 0);
}
@ -1436,6 +1446,10 @@ LONG WINAPI Emulate_SCardGetStatusChangeW(SmartcardEmulationContext* smartcard,
SCardContext* value = HashTable_GetItemValue(smartcard->contexts, (const void*)hContext);
WINPR_ASSERT(value); /* Must be valid after Emulate_SCardIsValidContext */
freerdp* inst =
freerdp_settings_get_pointer_writable(smartcard->settings, FreeRDP_instance);
WINPR_ASSERT(inst);
status = SCARD_E_TIMEOUT;
do
{
@ -1483,6 +1497,11 @@ LONG WINAPI Emulate_SCardGetStatusChangeW(SmartcardEmulationContext* smartcard,
Sleep(diff);
if (dwTimeout != INFINITE)
dwTimeout -= MIN(dwTimeout, diff);
if (freerdp_shall_disconnect_context(inst->context))
{
status = SCARD_E_CANCELLED;
break;
}
} while (dwTimeout > 0);
}