@@ -566,22 +566,23 @@ static int report(enum updatehub_state state)
566
566
return ret ;
567
567
}
568
568
569
- static void probe_cb (char * metadata )
569
+ static void probe_cb (char * metadata , size_t metadata_size )
570
570
{
571
571
struct coap_packet reply ;
572
- char tmp [MAX_PAYLOAD_SIZE ];
572
+ char tmp [MAX_DOWNLOAD_DATA ];
573
+ size_t tmp_len ;
573
574
int rcvd = -1 ;
574
575
575
576
wait_fds ();
576
577
577
- rcvd = recv (ctx .sock , metadata , MAX_PAYLOAD_SIZE , MSG_DONTWAIT );
578
+ rcvd = recv (ctx .sock , tmp , MAX_DOWNLOAD_DATA , MSG_DONTWAIT );
578
579
if (rcvd <= 0 ) {
579
580
LOG_ERR ("Could not receive data" );
580
581
ctx .code_status = UPDATEHUB_NETWORKING_ERROR ;
581
582
return ;
582
583
}
583
584
584
- if (coap_packet_parse (& reply , metadata , rcvd , NULL , 0 ) < 0 ) {
585
+ if (coap_packet_parse (& reply , tmp , rcvd , NULL , 0 ) < 0 ) {
585
586
LOG_ERR ("Invalid data received" );
586
587
ctx .code_status = UPDATEHUB_DOWNLOAD_ERROR ;
587
588
return ;
@@ -593,10 +594,25 @@ static void probe_cb(char *metadata)
593
594
return ;
594
595
}
595
596
596
- memset (& tmp , 0 , MAX_PAYLOAD_SIZE );
597
- memcpy (tmp , reply .data + reply .offset , reply .max_len - reply .offset );
598
- memset (metadata , 0 , MAX_PAYLOAD_SIZE );
599
- memcpy (metadata , tmp , strlen (tmp ));
597
+ /* check if we have buffer space to receive payload */
598
+ if (metadata_size < (reply .max_len - reply .offset )) {
599
+ LOG_ERR ("There is no buffer available" );
600
+ ctx .code_status = UPDATEHUB_METADATA_ERROR ;
601
+ return ;
602
+ }
603
+
604
+ memcpy (metadata , reply .data + reply .offset ,
605
+ reply .max_len - reply .offset );
606
+
607
+ /* ensures payload have a valid string with size lower
608
+ * than metadata_size
609
+ */
610
+ tmp_len = strlen (metadata );
611
+ if (tmp_len >= metadata_size ) {
612
+ LOG_ERR ("Invalid metadata data received" );
613
+ ctx .code_status = UPDATEHUB_METADATA_ERROR ;
614
+ return ;
615
+ }
600
616
601
617
ctx .code_status = UPDATEHUB_OK ;
602
618
@@ -609,8 +625,8 @@ enum updatehub_response updatehub_probe(void)
609
625
struct resp_probe_some_boards metadata_some_boards ;
610
626
struct resp_probe_any_boards metadata_any_boards ;
611
627
612
- char * metadata = k_malloc (MAX_PAYLOAD_SIZE );
613
- char * metadata_copy = k_malloc (MAX_PAYLOAD_SIZE );
628
+ char * metadata = k_malloc (MAX_DOWNLOAD_DATA );
629
+ char * metadata_copy = k_malloc (MAX_DOWNLOAD_DATA );
614
630
char * device_id = k_malloc (DEVICE_ID_HEX_MAX_SIZE );
615
631
char * firmware_version = k_malloc (BOOT_IMG_VER_STRLEN_MAX );
616
632
@@ -665,8 +681,7 @@ enum updatehub_response updatehub_probe(void)
665
681
goto cleanup ;
666
682
}
667
683
668
- memset (metadata , 0 , MAX_PAYLOAD_SIZE );
669
- probe_cb (metadata );
684
+ probe_cb (metadata , MAX_DOWNLOAD_DATA );
670
685
671
686
if (ctx .code_status != UPDATEHUB_OK ) {
672
687
goto cleanup ;
0 commit comments