aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2018-03-13 03:53:49 +0000
committerNIIBE Yutaka <[email protected]>2018-03-13 03:53:49 +0000
commitc84bae69e9e02923f7180e09d161cb0b13257436 (patch)
tree6d22cfa62e6a4caf2e6d8f8343436705dac41c4f
parentscd: Fix for GNU/Linux suspend/resume. (diff)
downloadgnupg-c84bae69e9e02923f7180e09d161cb0b13257436.tar.gz
gnupg-c84bae69e9e02923f7180e09d161cb0b13257436.zip
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 <[email protected]>
-rw-r--r--scd/apdu.c9
1 files changed, 9 insertions, 0 deletions
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);
}