Fix APDU buffer problem under MAC OS.

This commit is contained in:
Werner Koch 2008-08-11 07:42:25 +00:00
parent 7d2cfee1df
commit 4fa68f839b
2 changed files with 14 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2008-08-11 Werner Koch <wk@g10code.com>
* apdu.c (reset_pcsc_reader, open_pcsc_reader)
(reset_rapdu_reader, open_rapdu_reader): Allow ATRs of up to 33
bytes. Provide maximum size of ATR buffer using DIM. Such long
ATR are never seen in reality but the PC/SC library of MAC OS X is
just too buggy. Reported by Ludovic Rousseau. Fixes bug #948.
2008-07-30 Werner Koch <wk@g10code.com> 2008-07-30 Werner Koch <wk@g10code.com>
* app-openpgp.c (verify_a_chv): Use xtrymalloc and make the prompt * app-openpgp.c (verify_a_chv): Use xtrymalloc and make the prompt

View File

@ -912,7 +912,7 @@ reset_pcsc_reader (int slot)
} }
atrlen = 33; atrlen = DIM(reader_table[0].atr);
nreader = sizeof reader - 1; nreader = sizeof reader - 1;
err = pcsc_status (reader_table[slot].pcsc.card, err = pcsc_status (reader_table[slot].pcsc.card,
reader, &nreader, reader, &nreader,
@ -925,7 +925,7 @@ reset_pcsc_reader (int slot)
reader_table[slot].atrlen = 0; reader_table[slot].atrlen = 0;
return pcsc_error_to_sw (err); return pcsc_error_to_sw (err);
} }
if (atrlen >= DIM (reader_table[0].atr)) if (atrlen > DIM (reader_table[0].atr))
log_bug ("ATR returned by pcsc_status is too large\n"); log_bug ("ATR returned by pcsc_status is too large\n");
reader_table[slot].atrlen = atrlen; reader_table[slot].atrlen = atrlen;
reader_table[slot].is_t0 = !!(card_protocol & PCSC_PROTOCOL_T0); reader_table[slot].is_t0 = !!(card_protocol & PCSC_PROTOCOL_T0);
@ -1632,7 +1632,7 @@ open_pcsc_reader (const char *portstr)
char reader[250]; char reader[250];
unsigned long readerlen; unsigned long readerlen;
atrlen = 32; atrlen = DIM (reader_table[0].atr);
readerlen = sizeof reader -1 ; readerlen = sizeof reader -1 ;
err = pcsc_status (reader_table[slot].pcsc.card, err = pcsc_status (reader_table[slot].pcsc.card,
reader, &readerlen, reader, &readerlen,
@ -1643,7 +1643,7 @@ open_pcsc_reader (const char *portstr)
pcsc_error_string (err), err, readerlen); pcsc_error_string (err), err, readerlen);
else else
{ {
if (atrlen >= DIM (reader_table[0].atr)) if (atrlen > DIM (reader_table[0].atr))
log_bug ("ATR returned by pcsc_status is too large\n"); log_bug ("ATR returned by pcsc_status is too large\n");
reader_table[slot].atrlen = atrlen; reader_table[slot].atrlen = atrlen;
/* If we got to here we know that a card is present /* If we got to here we know that a card is present
@ -1933,7 +1933,7 @@ reset_rapdu_reader (int slot)
rapdu_msg_release (msg); rapdu_msg_release (msg);
return sw; return sw;
} }
if (msg->datalen >= DIM (slotp->atr)) if (msg->datalen > DIM (slotp->atr))
{ {
log_error ("ATR returned by the RAPDU layer is too large\n"); log_error ("ATR returned by the RAPDU layer is too large\n");
rapdu_msg_release (msg); rapdu_msg_release (msg);
@ -2114,7 +2114,7 @@ open_rapdu_reader (int portno,
rapdu_strerror (msg->cmd)); rapdu_strerror (msg->cmd));
goto failure; goto failure;
} }
if (msg->datalen >= DIM (slotp->atr)) if (msg->datalen > DIM (slotp->atr))
{ {
log_error ("ATR returned by the RAPDU layer is too large\n"); log_error ("ATR returned by the RAPDU layer is too large\n");
goto failure; goto failure;