aboutsummaryrefslogtreecommitdiffstats
path: root/scd/apdu.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2021-04-29 07:14:14 +0000
committerWerner Koch <[email protected]>2021-04-29 07:14:25 +0000
commit8d81fd7c01e8dfacc719ff190f8e364014e32fdf (patch)
tree80bd0c1ea68b7d4220ddf995b9dc774aa8240db3 /scd/apdu.c
parentscd:p15: Fix the name of a card. (diff)
downloadgnupg-8d81fd7c01e8dfacc719ff190f8e364014e32fdf.tar.gz
gnupg-8d81fd7c01e8dfacc719ff190f8e364014e32fdf.zip
scd: Fix PC/SC removed card problem
* scd/apdu.c (pcsc_cancel): New. (pcsc_init): Load new function. (connect_pcsc_card): Use it after a removed card error. -- Well, that was easier than I expected yesterday. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'scd/apdu.c')
-rw-r--r--scd/apdu.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/scd/apdu.c b/scd/apdu.c
index c826301ef..1dd6427da 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -302,6 +302,7 @@ long (* DLSTDCALL pcsc_establish_context) (pcsc_dword_t scope,
const void *reserved2,
HANDLE *r_context);
long (* DLSTDCALL pcsc_release_context) (HANDLE context);
+long (* DLSTDCALL pcsc_cancel) (HANDLE context);
long (* DLSTDCALL pcsc_list_readers) (HANDLE context,
const char *groups,
char *readers, pcsc_dword_t*readerslen);
@@ -873,6 +874,15 @@ connect_pcsc_card (int slot)
if (err != PCSC_E_NO_SMARTCARD)
log_error ("pcsc_connect failed: %s (0x%lx)\n",
pcsc_error_string (err), err);
+ if (err == PCSC_W_REMOVED_CARD && pcsc_cancel)
+ {
+ long err2;
+ if ((err2=pcsc_cancel (pcsc.context)))
+ log_error ("pcsc_cancel failed: %s (0x%lx)\n",
+ pcsc_error_string (err2), err2);
+ else if (opt.verbose)
+ log_error ("pcsc_cancel succeeded\n");
+ }
}
else
{
@@ -1136,6 +1146,7 @@ pcsc_init (void)
pcsc_establish_context = dlsym (handle, "SCardEstablishContext");
pcsc_release_context = dlsym (handle, "SCardReleaseContext");
+ pcsc_cancel = dlsym (handle, "SCardCancel");
pcsc_list_readers = dlsym (handle, "SCardListReaders");
#if defined(_WIN32) || defined(__CYGWIN__)
if (!pcsc_list_readers)