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 Georg Schwarz georg.schwarz at iname.com
Giampaolo Tomassoni g.tomassoni at libero.it Giampaolo Tomassoni g.tomassoni at libero.it
Gilbert Fernandes gilbert_fernandes at hotmail.com Gilbert Fernandes gilbert_fernandes at hotmail.com
Grant Olson kgo at grant-olson net
Greg Louis glouis at dynamicro.on.ca Greg Louis glouis at dynamicro.on.ca
Greg Troxel gdt at ir.bbn.com Greg Troxel gdt at ir.bbn.com
Gregory Steuck steuck at iname.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> 2011-01-25 Werner Koch <wk@g10code.com>
From 2.0 branch, 2010-03-17: 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)) if (apdu_reset (slot))
{ {
slot_table[slot].reset_failed = 1; slot_table[slot].valid = 0;
} }
application_notify_card_reset (slot); application_notify_card_reset (slot);
} }
@ -401,6 +401,14 @@ get_reader_slot (void)
{ {
int no_service_flag; int no_service_flag;
ss->slot = apdu_open_reader (opt.reader_port, &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) if (no_service_flag)
{ {
log_info ("no card services - disabling scdaemon\n"); 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) if (sw_apdu == SW_HOST_NO_READER)
{ {
/* Most likely the _reader_ has been unplugged. */ /* Most likely the _reader_ has been unplugged. */
apdu_close_reader(ss->slot);
ss->valid = 0;
status = 0; status = 0;
changed = ss->changed; changed = ss->changed;
} }