usb: ccid: check ccid apdu length
authorPrasad J Pandit <pjp@fedoraproject.org>
Thu, 2 Feb 2017 19:22:28 +0000 (00:52 +0530)
committerGerd Hoffmann <kraxel@redhat.com>
Mon, 6 Feb 2017 09:23:18 +0000 (10:23 +0100)
CCID device emulator uses Application Protocol Data Units(APDU)
to exchange command and responses to and from the host.
The length in these units couldn't be greater than 65536. Add
check to ensure the same. It'd also avoid potential integer
overflow in emulated_apdu_from_guest.

Reported-by: Li Qiang <liqiang6-s@360.cn>
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
Message-id: 20170202192228.10847-1-ppandit@redhat.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
hw/usb/dev-smartcard-reader.c

index 89e11b68c4d55491ddf45d7f5741233a26c5e450..1325ea1659a064869a8cd3485e5968c75fac593e 100644 (file)
@@ -967,7 +967,7 @@ static void ccid_on_apdu_from_guest(USBCCIDState *s, CCID_XferBlock *recv)
     DPRINTF(s, 1, "%s: seq %d, len %d\n", __func__,
                 recv->hdr.bSeq, len);
     ccid_add_pending_answer(s, (CCID_Header *)recv);
-    if (s->card) {
+    if (s->card && len <= BULK_OUT_DATA_SIZE) {
         ccid_card_apdu_from_guest(s->card, recv->abData, len);
     } else {
         DPRINTF(s, D_WARN, "warning: discarded apdu\n");