summaryrefslogtreecommitdiff
path: root/security/openct/files/patch-src_pcsc_pcsc.c
diff options
context:
space:
mode:
authorAlex Dupre <ale@FreeBSD.org>2017-04-10 12:14:50 +0000
committerAlex Dupre <ale@FreeBSD.org>2017-04-10 12:14:50 +0000
commitb4859c7285f931d1654b589c94ecb10a7b7416cf (patch)
tree3f3ff7b4973c7924addd261898cefc3af2734c08 /security/openct/files/patch-src_pcsc_pcsc.c
parent- Update to 1.8.11 (diff)
Don't truncate received APDU when talking to pcsc-lite.
PR: 204552 Submitted by: Marcin Cieslak <saper@saper.info>
Diffstat (limited to 'security/openct/files/patch-src_pcsc_pcsc.c')
-rw-r--r--security/openct/files/patch-src_pcsc_pcsc.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/security/openct/files/patch-src_pcsc_pcsc.c b/security/openct/files/patch-src_pcsc_pcsc.c
new file mode 100644
index 000000000000..2ac00d4704f4
--- /dev/null
+++ b/security/openct/files/patch-src_pcsc_pcsc.c
@@ -0,0 +1,50 @@
+--- src/pcsc/pcsc.c.orig 2007-05-25 21:11:45 UTC
++++ src/pcsc/pcsc.c
+@@ -25,6 +25,7 @@
+ #ifdef DEBUG_IFDH
+ #include <syslog.h>
+ #endif
++#include <limits.h>
+ #ifdef __APPLE__
+ #include <PCSC/wintypes.h>
+ #include <PCSC/pcsclite.h>
+@@ -390,6 +391,10 @@ IFDHTransmitToICC(DWORD Lun, SCARD_IO_HE
+ ctn = ((unsigned short)(Lun >> 16)) % IFDH_MAX_READERS;
+ slot = ((unsigned short)(Lun & 0x0000FFFF)) % IFDH_MAX_SLOTS;
+
++ if (TxLength > USHRT_MAX) {
++ (*RxLength) = 0;
++ return IFD_PROTOCOL_NOT_SUPPORTED;
++ }
+ #ifdef HAVE_PTHREAD
+ pthread_mutex_lock(&ifdh_context_mutex[ctn]);
+ #endif
+@@ -399,7 +404,7 @@ IFDHTransmitToICC(DWORD Lun, SCARD_IO_HE
+ #endif
+ dad = (UCHAR) ((slot == 0) ? 0x00 : slot + 1);
+ sad = 0x02;
+- lr = (unsigned short)(*RxLength);
++ lr = (*RxLength > USHRT_MAX) ? USHRT_MAX : (unsigned short)(*RxLength);
+ lc = (unsigned short)TxLength;
+
+ ret = CT_data(ctn, &dad, &sad, lc, TxBuffer, &lr, RxBuffer);
+@@ -438,6 +443,10 @@ IFDHControl(DWORD Lun, PUCHAR TxBuffer,
+ ctn = ((unsigned short)(Lun >> 16)) % IFDH_MAX_READERS;
+ slot = ((unsigned short)(Lun & 0x0000FFFF)) % IFDH_MAX_SLOTS;
+
++ if (TxLength > USHRT_MAX) {
++ (*RxLength) = 0;
++ return IFD_PROTOCOL_NOT_SUPPORTED;
++ }
+ #ifdef HAVE_PTHREAD
+ pthread_mutex_lock(&ifdh_context_mutex[ctn]);
+ #endif
+@@ -447,7 +456,7 @@ IFDHControl(DWORD Lun, PUCHAR TxBuffer,
+ #endif
+ dad = 0x01;
+ sad = 0x02;
+- lr = (unsigned short)(*RxLength);
++ lr = (*RxLength > USHRT_MAX) ? USHRT_MAX : (unsigned short)(*RxLength);
+ lc = (unsigned short)TxLength;
+
+ ret = CT_data(ctn, &dad, &sad, lc, TxBuffer, &lr, RxBuffer);