From 8f77abdc009007605ace8c3ac554eef10d99d735 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Wed, 26 Mar 2014 17:47:50 +0100 Subject: [PATCH] vpcd win32: fixed race condition --- .../win32/BixVReader/BixVReader.ini | 93 ++----------------- virtualsmartcard/win32/BixVReader/Reader.h | 3 + .../win32/BixVReader/VpcdReader.cpp | 45 +++++++-- 3 files changed, 48 insertions(+), 93 deletions(-) diff --git a/virtualsmartcard/win32/BixVReader/BixVReader.ini b/virtualsmartcard/win32/BixVReader/BixVReader.ini index b148a78..1bec51f 100644 --- a/virtualsmartcard/win32/BixVReader/BixVReader.ini +++ b/virtualsmartcard/win32/BixVReader/BixVReader.ini @@ -1,84 +1,9 @@ -[Driver] -NumReaders=12 - -[Reader0] -RPC_TYPE=0 -VENDOR_NAME=VirtualCard -VENDOR_IFD_TYPE=BixReader -DECIVE_UNIT=0 - -[Reader1] -RPC_TYPE=1 -VENDOR_NAME=VirtualCard -VENDOR_IFD_TYPE=BixReader -DECIVE_UNIT=1 - -[Reader2] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35963 -DECIVE_UNIT=2 - -[Reader3] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35964 -DECIVE_UNIT=3 - -[Reader4] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35965 -DECIVE_UNIT=4 - -[Reader5] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35966 -DECIVE_UNIT=5 - -[Reader6] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35967 -DECIVE_UNIT=6 - -[Reader7] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35968 -DECIVE_UNIT=7 - -[Reader8] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35969 -DECIVE_UNIT=8 - -[Reader9] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35970 -DECIVE_UNIT=9 - -[Reader10] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35971 -DECIVE_UNIT=10 - -[Reader11] -RPC_TYPE=2 -VENDOR_NAME=Virtual Smart Card Architecture -VENDOR_IFD_TYPE=Virtual PCD -TCP_PORT=35972 -DECIVE_UNIT=11 +[Driver] +NumReaders=1 + +[Reader0] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35963 +DECIVE_UNIT=0 \ No newline at end of file diff --git a/virtualsmartcard/win32/BixVReader/Reader.h b/virtualsmartcard/win32/BixVReader/Reader.h index 733acd9..a5554bd 100644 --- a/virtualsmartcard/win32/BixVReader/Reader.h +++ b/virtualsmartcard/win32/BixVReader/Reader.h @@ -93,6 +93,7 @@ public: bool cardPresent; VpcdReader(); + ~VpcdReader(); bool QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen); bool QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset=false); bool CheckATR(); @@ -101,4 +102,6 @@ public: void init(wchar_t *section); void signalRemoval(void); void signalInsertion(void); + + CRITICAL_SECTION ioSection; }; diff --git a/virtualsmartcard/win32/BixVReader/VpcdReader.cpp b/virtualsmartcard/win32/BixVReader/VpcdReader.cpp index a94eb9c..d6965f2 100644 --- a/virtualsmartcard/win32/BixVReader/VpcdReader.cpp +++ b/virtualsmartcard/win32/BixVReader/VpcdReader.cpp @@ -13,8 +13,13 @@ int VpcdReader::portBase; VpcdReader::VpcdReader() { rpcType=2; - state=SCARD_ABSENT; + state = SCARD_ABSENT; cardPresent = false; + InitializeCriticalSection(&ioSection); +} + +VpcdReader::~VpcdReader() { + DeleteCriticalSection(&ioSection); } void VpcdReader::init(wchar_t *section) { portBase=GetPrivateProfileInt(L"Driver",L"RPC_PORT_BASE",VPCDPORT,L"BixVReader.ini"); @@ -24,12 +29,19 @@ void VpcdReader::init(wchar_t *section) { bool VpcdReader::CheckATR() { bool r = false; - struct vicc_ctx *vicc_ctx = (struct vicc_ctx *) ctx; + { + SectionLocker lock(ioSection); if (vicc_present((struct vicc_ctx *) ctx) == 1) { - signalInsertion(); r = true; - } else { + } + } + + + if (r) { + signalInsertion(); + } + else { signalRemoval(); } @@ -41,7 +53,10 @@ bool VpcdReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen) { bool r = false; if (APDU && APDUlen && Resp && Resplen) { - rapdu_len = vicc_transmit((struct vicc_ctx *) ctx, APDUlen, APDU, &rapdu); + { + SectionLocker lock(ioSection); + rapdu_len = vicc_transmit((struct vicc_ctx *) ctx, APDUlen, APDU, &rapdu); + } if (rapdu_len > 0) { memcpy(Resp, rapdu, rapdu_len); *Resplen = rapdu_len; @@ -61,7 +76,10 @@ bool VpcdReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { bool r = false; if (ATR && ATRsize) { - atr_len = vicc_getatr((struct vicc_ctx *) ctx, &atr); + { + SectionLocker lock(ioSection); + atr_len = vicc_getatr((struct vicc_ctx *) ctx, &atr); + } if (atr_len > 0) { /* TODO do length checking on length of ATR when ATRsize is * correctly initialized by Reader.cpp */ @@ -70,7 +88,10 @@ bool VpcdReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { free(atr); r = true; if (reset) + { + SectionLocker lock(ioSection); vicc_reset((struct vicc_ctx *) ctx); + } } else { signalRemoval(); } @@ -81,7 +102,10 @@ bool VpcdReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { DWORD VpcdReader::startServer() { breakSocket = false; - ctx = vicc_init(NULL, port); + { + SectionLocker lock(ioSection); + ctx = vicc_init(NULL, port); + } while (!breakSocket) { CheckATR(); Sleep(1000); @@ -92,8 +116,11 @@ DWORD VpcdReader::startServer() { void VpcdReader::shutdown() { breakSocket=true; WaitForSingleObject(serverThread,10000); - serverThread=NULL; - vicc_exit((struct vicc_ctx *) ctx); + serverThread = NULL; + { + SectionLocker lock(ioSection); + vicc_exit((struct vicc_ctx *) ctx); + } state=SCARD_ABSENT; ctx = NULL; if (waitRemoveIpr!=NULL) {