From cb2f55e9edae268d101e3e81f73a3498cfa68cf0 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 25 Jan 2011 21:08:36 +0100 Subject: Fix problem with unplugged 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. --- THANKS | 1 + scd/ChangeLog | 7 +++++++ scd/command.c | 12 +++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/THANKS b/THANKS index 8e4c9129a..10e8631aa 100644 --- 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 diff --git a/scd/ChangeLog b/scd/ChangeLog index 419f9d44d..5fb59095f 100644 --- a/scd/ChangeLog +++ b/scd/ChangeLog @@ -1,3 +1,10 @@ +2011-01-25 NIIBE Yutaka , + Grant Olson (wk) + + * command.c (do_reset, get_reader_slot) + (update_reader_status_file): Fix handling of the VALID flag for + unplugged readers. + 2010-03-17 Werner Koch * command.c (open_card): Return GPG_ERR_NOT_OPERATIONAL if no diff --git a/scd/command.c b/scd/command.c index e2cd1f514..28bc4df41 100644 --- a/scd/command.c +++ b/scd/command.c @@ -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"); @@ -2192,6 +2200,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; } -- cgit v1.2.3