Преглед изворни кода

Fail on unrealistically large PACS

Eric Betts пре 2 година
родитељ
комит
677dcea5d0
1 измењених фајлова са 8 додато и 3 уклоњено
  1. 8 3
      seader_worker.c

+ 8 - 3
seader_worker.c

@@ -338,7 +338,7 @@ void sendCardDetected(SeaderUartBridge* seader_uart, CardDetails_t* cardDetails)
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
 }
 
-bool unpack_pacs(SeaderCredential* seader_credential, uint8_t* buf, size_t size) {
+bool unpack_pacs(SeaderWorker* seader_worker, SeaderCredential* seader_credential, uint8_t* buf, size_t size) {
     PAC_t* pac = 0;
     pac = calloc(1, sizeof *pac);
     assert(pac);
@@ -354,14 +354,19 @@ bool unpack_pacs(SeaderCredential* seader_credential, uint8_t* buf, size_t size)
         }
 
         if(pac->size <= sizeof(seader_credential->credential)) {
+            // TODO: make credential into a 12 byte array
             seader_credential->bit_length = pac->size * 8 - pac->bits_unused;
             memcpy(&seader_credential->credential, pac->buf, pac->size);
             seader_credential->credential = __builtin_bswap64(seader_credential->credential);
             seader_credential->credential = seader_credential->credential >>
                                             (64 - seader_credential->bit_length);
             rtn = true;
+        } else {
+            // PACS too big (probably bad data)
+            if(seader_worker->callback) {
+                seader_worker->callback(SeaderWorkerEventFail, seader_worker->context);
+            }
         }
-        // TODO: make credential into a 12 byte array
     }
 
     ASN_STRUCT_FREE(asn_DEF_PAC, pac);
@@ -383,7 +388,7 @@ bool parseSamResponse(SeaderWorker* seader_worker, SamResponse_t* samResponse) {
                 seader_worker->callback(SeaderWorkerEventFail, seader_worker->context);
             }
         }
-    } else if(unpack_pacs(credential, samResponse->buf, samResponse->size)) {
+    } else if(unpack_pacs(seader_worker, credential, samResponse->buf, samResponse->size)) {
         if(seader_worker->callback) {
             seader_worker->callback(SeaderWorkerEventSuccess, seader_worker->context);
         }