@@ -669,6 +669,9 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
669
669
ASSERT (recv_len != NULL );
670
670
ASSERT (send_len != 0 );
671
671
672
+ uint8_t expected_recv_len = * recv_len ;
673
+ * recv_len = 0 ;
674
+
672
675
ret_code_t err_code = adafruit_diagnose_card_presence ();
673
676
if (err_code != 0 )
674
677
return NFC_CARD_ABSENT ;
@@ -693,8 +696,10 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
693
696
694
697
total_packets = ceil (send_len / (1.0 * SEND_PACKET_MAX_LEN ));
695
698
for (int packet = 1 ; packet <= total_packets ;) {
696
- recv_pkt_len = RECV_PACKET_MAX_ENC_LEN ; /* On every request set acceptable
697
- packet length */
699
+ recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= expected_recv_len
700
+ ? RECV_PACKET_MAX_ENC_LEN
701
+ : expected_recv_len ; /* On every request set acceptable
702
+ packet length */
698
703
699
704
/**
700
705
* Sets appropriate CLA byte for each packet. CLA byte (first byte of
@@ -757,11 +762,14 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
757
762
758
763
/** Prepare to request next packet from the card */
759
764
* recv_len = recv_pkt_len ;
760
- recv_pkt_len = RECV_PACKET_MAX_ENC_LEN ;
765
+ uint8_t remaining_recv_len = expected_recv_len - * recv_len + 2 ;
766
+ recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= remaining_recv_len
767
+ ? RECV_PACKET_MAX_ENC_LEN
768
+ : remaining_recv_len ;
761
769
request_chain_pkt [2 ] = ceil (* recv_len * 1.0 / RECV_PACKET_MAX_LEN );
762
770
763
771
/** Request all the remaining packets of multi-packet response */
764
- while (recv_apdu [* recv_len - 2 ] == 0x61 ) {
772
+ while (recv_apdu [* recv_len - 2 ] == 0x61 && recv_pkt_len > 0 ) {
765
773
* recv_len -= 2 ;
766
774
err_code = adafruit_pn532_in_data_exchange (request_chain_pkt ,
767
775
sizeof (request_chain_pkt ),
@@ -787,7 +795,10 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
787
795
788
796
/** Prepare to request next packet from the card */
789
797
* recv_len += recv_pkt_len ;
790
- recv_pkt_len = RECV_PACKET_MAX_ENC_LEN ;
798
+ remaining_recv_len = expected_recv_len - * recv_len + 2 ;
799
+ recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= remaining_recv_len
800
+ ? RECV_PACKET_MAX_ENC_LEN
801
+ : remaining_recv_len ;
791
802
request_chain_pkt [2 ] = * recv_len / RECV_PACKET_MAX_LEN + 1 ;
792
803
}
793
804
0 commit comments