From c84bae69e9e02923f7180e09d161cb0b13257436 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 13 Mar 2018 12:53:49 +0900 Subject: [PATCH] scd: After fatal error, shutdown a reader. * scd/apdu.c (pcsc_send_apdu): Notify main loop after fatal errors. -- GnuPG-bug-id: 3825 Signed-off-by: NIIBE Yutaka --- scd/apdu.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scd/apdu.c b/scd/apdu.c index 2ae6253ff..cd98cc91c 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -229,6 +229,7 @@ static npth_mutex_t reader_table_lock; #define PCSC_E_READER_UNAVAILABLE 0x80100017 #define PCSC_E_NO_SERVICE 0x8010001D #define PCSC_E_SERVICE_STOPPED 0x8010001E +#define PCSC_W_RESET_CARD 0x80100068 #define PCSC_W_REMOVED_CARD 0x80100069 /* Fix pcsc-lite ABI incompatibility. */ @@ -751,6 +752,14 @@ pcsc_send_apdu (int slot, unsigned char *apdu, size_t apdulen, log_error ("pcsc_transmit failed: %s (0x%lx)\n", pcsc_error_string (err), err); + /* Handle fatal errors which require shutdown of reader. */ + if (err == PCSC_E_NOT_TRANSACTED || err == PCSC_W_RESET_CARD + || err == PCSC_W_REMOVED_CARD) + { + reader_table[slot].pcsc.current_state = PCSC_STATE_UNAWARE; + scd_kick_the_loop (); + } + return pcsc_error_to_sw (err); }