From 7d8675074f99f30727403d69c51f440f24a2b024 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Wed, 29 Mar 2017 13:45:04 +0200 Subject: [PATCH] Fail SCardEstablishContext if no readers connected Windows smartcard application generally behaves better with polling of smartcard subsystem availability than when there are no smartcard readers available. This is a potential workaround for issue #109 --- scard.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scard.c b/scard.c index 7548531..6be3212 100644 --- a/scard.c +++ b/scard.c @@ -665,6 +665,8 @@ TS_SCardEstablishContext(STREAM in, STREAM out) MYPCSC_DWORD rv; MYPCSC_SCARDCONTEXT myHContext; SERVER_SCARDCONTEXT hContext; + char *readers = NULL; + DWORD readerCount = 1024; hContext = 0; @@ -679,12 +681,25 @@ TS_SCardEstablishContext(STREAM in, STREAM out) goto bail_out; } - if (myHContext == NULL) + if (!myHContext) { logger(SmartCard, Error, "TS_SCardEstablishedContext(), myHContext == NULL"); goto bail_out; } + /* This is a workaround where windows application generally + behaves better with polling of smartcard subsystem + availability than were there are no readers available. */ + rv = SCardListReaders(myHContext, NULL, readers, &readerCount); + if (rv != SCARD_S_SUCCESS) + { + logger(SmartCard, Debug, + "TS_SCardEstablishContext(), No readers connected, return no service to client."); + rv = SCARD_E_NO_SERVICE; + goto bail_out; + } + + /* add context to list of handle and get server handle */ _scard_handle_list_add(myHContext);