aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2008-08-11 07:42:25 +0000
committerWerner Koch <[email protected]>2008-08-11 07:42:25 +0000
commit4fa68f839b2c4cf6192fe4aee4ea84736ed9a6f9 (patch)
tree4c48f169de22c676802f799084b5f63e6c5cf116
parent2008-08-08 Marcus Brinkmann <[email protected]> (diff)
downloadgnupg-4fa68f839b2c4cf6192fe4aee4ea84736ed9a6f9.tar.gz
gnupg-4fa68f839b2c4cf6192fe4aee4ea84736ed9a6f9.zip
Fix APDU buffer problem under MAC OS.
-rw-r--r--scd/ChangeLog8
-rw-r--r--scd/apdu.c12
2 files changed, 14 insertions, 6 deletions
diff --git a/scd/ChangeLog b/scd/ChangeLog
index 7d4370ad0..dcfdc60f9 100644
--- a/scd/ChangeLog
+++ b/scd/ChangeLog
@@ -1,3 +1,11 @@
+2008-08-11 Werner Koch <[email protected]>
+
+ * 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 <[email protected]>
* app-openpgp.c (verify_a_chv): Use xtrymalloc and make the prompt
diff --git a/scd/apdu.c b/scd/apdu.c
index e2d43bd9d..2aa584bad 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -912,7 +912,7 @@ reset_pcsc_reader (int slot)
}
- atrlen = 33;
+ atrlen = DIM(reader_table[0].atr);
nreader = sizeof reader - 1;
err = pcsc_status (reader_table[slot].pcsc.card,
reader, &nreader,
@@ -925,7 +925,7 @@ reset_pcsc_reader (int slot)
reader_table[slot].atrlen = 0;
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");
reader_table[slot].atrlen = atrlen;
reader_table[slot].is_t0 = !!(card_protocol & PCSC_PROTOCOL_T0);
@@ -1632,7 +1632,7 @@ open_pcsc_reader (const char *portstr)
char reader[250];
unsigned long readerlen;
- atrlen = 32;
+ atrlen = DIM (reader_table[0].atr);
readerlen = sizeof reader -1 ;
err = pcsc_status (reader_table[slot].pcsc.card,
reader, &readerlen,
@@ -1643,7 +1643,7 @@ open_pcsc_reader (const char *portstr)
pcsc_error_string (err), err, readerlen);
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");
reader_table[slot].atrlen = atrlen;
/* 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);
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");
rapdu_msg_release (msg);
@@ -2114,7 +2114,7 @@ open_rapdu_reader (int portno,
rapdu_strerror (msg->cmd));
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");
goto failure;