@@ -587,22 +587,23 @@ static int report(enum updatehub_state state)
587587 return ret ;
588588}
589589
590- static void probe_cb (char * metadata )
590+ static void probe_cb (char * metadata , size_t metadata_size )
591591{
592592 struct coap_packet reply ;
593- char tmp [MAX_PAYLOAD_SIZE ];
593+ char tmp [MAX_DOWNLOAD_DATA ];
594+ size_t tmp_len ;
594595 int rcvd = -1 ;
595596
596597 wait_fds ();
597598
598- rcvd = recv (ctx .sock , metadata , MAX_PAYLOAD_SIZE , MSG_DONTWAIT );
599+ rcvd = recv (ctx .sock , tmp , MAX_DOWNLOAD_DATA , MSG_DONTWAIT );
599600 if (rcvd <= 0 ) {
600601 LOG_ERR ("Could not receive data" );
601602 ctx .code_status = UPDATEHUB_NETWORKING_ERROR ;
602603 return ;
603604 }
604605
605- if (coap_packet_parse (& reply , metadata , rcvd , NULL , 0 ) < 0 ) {
606+ if (coap_packet_parse (& reply , tmp , rcvd , NULL , 0 ) < 0 ) {
606607 LOG_ERR ("Invalid data received" );
607608 ctx .code_status = UPDATEHUB_DOWNLOAD_ERROR ;
608609 return ;
@@ -614,10 +615,25 @@ static void probe_cb(char *metadata)
614615 return ;
615616 }
616617
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+ }
621637
622638 ctx .code_status = UPDATEHUB_OK ;
623639
@@ -630,8 +646,8 @@ enum updatehub_response updatehub_probe(void)
630646 struct resp_probe_some_boards metadata_some_boards ;
631647 struct resp_probe_any_boards metadata_any_boards ;
632648
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 );
635651 char * device_id = k_malloc (DEVICE_ID_HEX_MAX_SIZE );
636652 char * firmware_version = k_malloc (BOOT_IMG_VER_STRLEN_MAX );
637653
@@ -686,8 +702,7 @@ enum updatehub_response updatehub_probe(void)
686702 goto cleanup ;
687703 }
688704
689- memset (metadata , 0 , MAX_PAYLOAD_SIZE );
690- probe_cb (metadata );
705+ probe_cb (metadata , MAX_DOWNLOAD_DATA );
691706
692707 if (ctx .code_status != UPDATEHUB_OK ) {
693708 goto cleanup ;
0 commit comments