Fixed problem with unplugging card readers.
authorWerner Koch <wk@gnupg.org>
Tue, 25 Jan 2011 21:03:16 +0000 (22:03 +0100)
committerWerner Koch <wk@gnupg.org>
Tue, 25 Jan 2011 21:03:16 +0000 (22:03 +0100)
From Grant Olsons's mail to gnupg-devel@:

  This is three-quarters NIIBE and one-quarter me, but I though it would
  be easier to have a single complete patch that applies to
  STABLE-BRANCH-2-0 than two patches floating around.

  This is basically NIIBE Yatuka's patch here:

  http://lists.gnupg.org/pipermail/gnupg-devel/2010-November/025828.html

  Plus another check that closes down the reader explicitly if we get a
  SW_HOST_NO_READER error, so that an unplugged reader doesn't hold onto
  the first slot, preventing us from getting to the active plugged reader.

THANKS
scd/ChangeLog
scd/command.c

diff --git a/THANKS b/THANKS
index c86fda3..b6dfc40 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -92,6 +92,7 @@ Geoff Keating            geoffk at ozemail.com.au
 Georg Schwarz              georg.schwarz at iname.com
 Giampaolo Tomassoni        g.tomassoni at libero.it
 Gilbert Fernandes          gilbert_fernandes at hotmail.com
+Grant Olson                kgo at grant-olson net
 Greg Louis                glouis at dynamicro.on.ca
 Greg Troxel               gdt at ir.bbn.com
 Gregory Steuck            steuck at iname.com
index d1e942a..c9f92b4 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-25  NIIBE Yutaka <gniibe@fsij.org>,
+           Grant Olson <kgo@grant-olson.net>  (wk)
+
+       * command.c (do_reset, get_reader_slot)
+       (update_reader_status_file): Fix handling of the VALID flag for
+       unplugged readers.
+
 2011-01-25  Werner Koch  <wk@g10code.com>
 
        From 2.0 branch, 2010-03-17:
index 36aff97..a44378d 100644 (file)
@@ -309,7 +309,7 @@ do_reset (ctrl_t ctrl, int send_reset)
     {
       if (apdu_reset (slot)) 
         {
-          slot_table[slot].reset_failed = 1;
+          slot_table[slot].valid = 0;
         }
       application_notify_card_reset (slot);
     }
@@ -401,6 +401,14 @@ get_reader_slot (void)
     {
       int no_service_flag;
       ss->slot = apdu_open_reader (opt.reader_port, &no_service_flag);
+
+      /* If we still don't have a slot, we have no readers.
+        Invalidate for now until a reader is attached. */
+      if(ss->slot == -1)
+       {
+         ss->valid = 0;
+       }
+
       if (no_service_flag)
         {
           log_info ("no card services - disabling scdaemon\n");
@@ -2190,6 +2198,8 @@ update_reader_status_file (int set_card_removed_flag)
       if (sw_apdu == SW_HOST_NO_READER)
         {
           /* Most likely the _reader_ has been unplugged.  */
+         apdu_close_reader(ss->slot);
+         ss->valid = 0;
           status = 0;
           changed = ss->changed;
         }