1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

disconnectafter wake-up bug fix by Bob Dunlop.

This commit is contained in:
Werner Koch 2006-08-21 08:40:45 +00:00
parent 368170215f
commit b122c9b6be
2 changed files with 29 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2006-08-21 Werner Koch <wk@g10code.com>
* pcsc-wrapper.c (handle_open, handle_close): Reset card and
protocol on error/close.
(handle_status): Don't set the stae if the state is unknown.
(handle_reset): Ignore an error if already disconnected. May
happen due to system wake-up after hibernation. Suggested by Bob
Dunlop.
2006-06-28 Werner Koch <wk@g10code.com>
* app-openpgp.c (do_writekey): Fixed computation of memmove

View File

@ -474,6 +474,8 @@ handle_open (unsigned char *argbuf, size_t arglen)
pcsc_release_context (pcsc_context);
free (current_rdrname);
current_rdrname = NULL;
pcsc_card = 0;
pcsc_protocol = 0;
request_failed (err);
return;
}
@ -527,6 +529,8 @@ handle_close (unsigned char *argbuf, size_t arglen)
free (current_rdrname);
current_rdrname = NULL;
pcsc_release_context (pcsc_context);
pcsc_card = 0;
pcsc_protocol = 0;
request_succeeded (NULL, 0);
}
@ -567,17 +571,20 @@ handle_status (unsigned char *argbuf, size_t arglen)
}
status = 0;
if ( (rdrstates[0].event_state & PCSC_STATE_PRESENT) )
status |= 2;
if ( !(rdrstates[0].event_state & PCSC_STATE_MUTE) )
status |= 4;
/* We indicate a useful card if it is not in use by another
application. This is because we only use exclusive access
mode. */
if ( (status & 6) == 6
&& !(rdrstates[0].event_state & PCSC_STATE_INUSE) )
status |= 1;
if ( !(rdrstates[0].event_state & PCSC_STATE_UNKNOWN) )
{
if ( (rdrstates[0].event_state & PCSC_STATE_PRESENT) )
status |= 2;
if ( !(rdrstates[0].event_state & PCSC_STATE_MUTE) )
status |= 4;
/* We indicate a useful card if it is not in use by another
application. This is because we only use exclusive access
mode. */
if ( (status & 6) == 6
&& !(rdrstates[0].event_state & PCSC_STATE_INUSE) )
status |= 1;
}
/* First word is identical to the one used by apdu.c. */
buf[0] = 0;
buf[1] = 0;
@ -618,6 +625,8 @@ handle_reset (unsigned char *argbuf, size_t arglen)
if (pcsc_card)
{
err = pcsc_disconnect (pcsc_card, PCSC_LEAVE_CARD);
if (err == 0x80100003) /* Invalid handle. (already disconnected) */
err = 0;
if (err)
{
fprintf (stderr, PGM": pcsc_disconnect failed: %s (0x%lx)\n",