@@ -587,22 +587,23 @@ static int report(enum updatehub_state state)
587
587
return ret ;
588
588
}
589
589
590
- static void probe_cb (char * metadata )
590
+ static void probe_cb (char * metadata , size_t metadata_size )
591
591
{
592
592
struct coap_packet reply ;
593
- char tmp [MAX_PAYLOAD_SIZE ];
593
+ char tmp [MAX_DOWNLOAD_DATA ];
594
+ size_t tmp_len ;
594
595
int rcvd = -1 ;
595
596
596
597
wait_fds ();
597
598
598
- rcvd = recv (ctx .sock , metadata , MAX_PAYLOAD_SIZE , MSG_DONTWAIT );
599
+ rcvd = recv (ctx .sock , tmp , MAX_DOWNLOAD_DATA , MSG_DONTWAIT );
599
600
if (rcvd <= 0 ) {
600
601
LOG_ERR ("Could not receive data" );
601
602
ctx .code_status = UPDATEHUB_NETWORKING_ERROR ;
602
603
return ;
603
604
}
604
605
605
- if (coap_packet_parse (& reply , metadata , rcvd , NULL , 0 ) < 0 ) {
606
+ if (coap_packet_parse (& reply , tmp , rcvd , NULL , 0 ) < 0 ) {
606
607
LOG_ERR ("Invalid data received" );
607
608
ctx .code_status = UPDATEHUB_DOWNLOAD_ERROR ;
608
609
return ;
@@ -614,10 +615,25 @@ static void probe_cb(char *metadata)
614
615
return ;
615
616
}
616
617
617
- memset (& tmp , 0 , MAX_PAYLOAD_SIZE );
618
- memcpy (tmp , reply .data + reply .offset , reply .max_len - reply .offset );
619
- memset (metadata , 0 , MAX_PAYLOAD_SIZE );
620
- memcpy (metadata , tmp , strlen (tmp ));
618
+ /* check if we have buffer space to receive payload */
619
+ if (metadata_size < (reply .max_len - reply .offset )) {
620
+ LOG_ERR ("There is no buffer available" );
621
+ ctx .code_status = UPDATEHUB_METADATA_ERROR ;
622
+ return ;
623
+ }
624
+
625
+ memcpy (metadata , reply .data + reply .offset ,
626
+ reply .max_len - reply .offset );
627
+
628
+ /* ensures payload have a valid string with size lower
629
+ * than metadata_size
630
+ */
631
+ tmp_len = strlen (metadata );
632
+ if (tmp_len >= metadata_size ) {
633
+ LOG_ERR ("Invalid metadata data received" );
634
+ ctx .code_status = UPDATEHUB_METADATA_ERROR ;
635
+ return ;
636
+ }
621
637
622
638
ctx .code_status = UPDATEHUB_OK ;
623
639
@@ -630,8 +646,8 @@ enum updatehub_response updatehub_probe(void)
630
646
struct resp_probe_some_boards metadata_some_boards ;
631
647
struct resp_probe_any_boards metadata_any_boards ;
632
648
633
- char * metadata = k_malloc (MAX_PAYLOAD_SIZE );
634
- char * metadata_copy = k_malloc (MAX_PAYLOAD_SIZE );
649
+ char * metadata = k_malloc (MAX_DOWNLOAD_DATA );
650
+ char * metadata_copy = k_malloc (MAX_DOWNLOAD_DATA );
635
651
char * device_id = k_malloc (DEVICE_ID_HEX_MAX_SIZE );
636
652
char * firmware_version = k_malloc (BOOT_IMG_VER_STRLEN_MAX );
637
653
@@ -686,8 +702,7 @@ enum updatehub_response updatehub_probe(void)
686
702
goto cleanup ;
687
703
}
688
704
689
- memset (metadata , 0 , MAX_PAYLOAD_SIZE );
690
- probe_cb (metadata );
705
+ probe_cb (metadata , MAX_DOWNLOAD_DATA );
691
706
692
707
if (ctx .code_status != UPDATEHUB_OK ) {
693
708
goto cleanup ;
0 commit comments