Fixed problem with unplugging card readers.

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.
This commit is contained in:
Werner Koch 2011-01-25 22:03:16 +01:00
parent ca2d315765
commit 576de6e539
3 changed files with 19 additions and 1 deletions

1
THANKS
View File

@ -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

View 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:

View 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;
}