[PATCH] open_pcsc_reader_wrapped should have same behavior as open_pcsc_reader_direct

NIIBE Yutaka gniibe at fsij.org
Tue Oct 30 06:35:35 CET 2012


I think that open_pcsc_reader_wrapped should be as same as
open_pcsc_reader_direct.

Currently, pcsc_no_service is only set by open_pcsc_reader_direct.

The patch below (against STABLE-BRANCH-2-0) fixes this.  Compiled
and tested lightly.

Mostly same patch can be applied to master, too.

diff --git a/scd/apdu.c b/scd/apdu.c
index 0ce1c51..b369a26 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -221,6 +221,7 @@ static char (* DLSTDCALL CT_close) (unsigned short ctn);
 #define PCSC_E_SYSTEM_CANCELLED        0x80100012
 #define PCSC_E_NOT_TRANSACTED          0x80100016
 #define PCSC_E_READER_UNAVAILABLE      0x80100017
+#define PCSC_E_NO_SERVICE              0x8010001D
 #define PCSC_W_REMOVED_CARD            0x80100069
 
 #define CM_IOCTL_GET_FEATURE_REQUEST (0x42000000 + 3400)
@@ -1711,7 +1712,7 @@ open_pcsc_reader_direct (const char *portstr)
                  pcsc_error_string (err), err);
       reader_table[slot].used = 0;
       unlock_slot (slot);
-      if (err == 0x8010001d)
+      if (err == PCSC_E_NO_SERVICE)
         pcsc_no_service = 1;
       return -1;
     }
@@ -1819,6 +1820,7 @@ open_pcsc_reader_wrapped (const char *portstr)
     {
       log_error ("can't run PC/SC access module `%s': %s\n",
                  wrapperpgm, strerror (errno));
+      pcsc_no_service = 1;
       return -1;
     }
 
@@ -1918,6 +1920,8 @@ open_pcsc_reader_wrapped (const char *portstr)
     ;
 #undef WAIT
 
+  pcsc_no_service = 1;
+
   /* Now send the open request. */
   msgbuf[0] = 0x01; /* OPEN command. */
   len = portstr? strlen (portstr):0;
@@ -1950,10 +1954,15 @@ open_pcsc_reader_wrapped (const char *portstr)
     {
       log_error ("PC/SC returned a too large ATR (len=%lx)\n",
                  (unsigned long)len);
+      pcsc_no_service = 0;
       goto command_failed;
     }
   err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16)
                        | (msgbuf[7] << 8 ) | msgbuf[8]);
+
+  if (err != PCSC_E_NO_SERVICE)
+    pcsc_no_service = 0;
+
   if (err)
     {
       log_error ("PC/SC OPEN failed: %s (0x%08x)\n",






More information about the Gnupg-devel mailing list