@@ -253,12 +253,13 @@ static char *_mdns_mangle_name(char *in)
253253 }
254254 sprintf (ret , "%s-2" , in );
255255 } else {
256- ret = malloc (strlen (in ) + 2 ); //one extra byte in case 9-10 or 99-100 etc
256+ size_t in_len = strlen (in );
257+ ret = malloc (in_len + 2 ); //one extra byte in case 9-10 or 99-100 etc
257258 if (ret == NULL ) {
258259 HOOK_MALLOC_FAILED ;
259260 return NULL ;
260261 }
261- strcpy (ret , in );
262+ memcpy (ret , in , in_len );
262263 int baseLen = p - in ; //length of 'bla' in 'bla-123'
263264 //overwrite suffix with new suffix
264265 sprintf (ret + baseLen , "-%d" , suffix + 1 );
@@ -1811,7 +1812,6 @@ static bool _mdns_create_answer_from_service(mdns_tx_packet_t *packet, mdns_serv
18111812 return false;
18121813 }
18131814 } else if (question -> type == MDNS_TYPE_SDPTR ) {
1814- shared = true;
18151815 if (!_mdns_alloc_answer (& packet -> answers , MDNS_TYPE_SDPTR , service , NULL , false, false)) {
18161816 return false;
18171817 }
@@ -2355,6 +2355,11 @@ static void _mdns_restart_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol
23552355 srv_count ++ ;
23562356 a = a -> next ;
23572357 }
2358+ if (srv_count == 0 ) {
2359+ // proble only IP
2360+ _mdns_init_pcb_probe (tcpip_if , ip_protocol , NULL , 0 , true);
2361+ return ;
2362+ }
23582363 mdns_srv_item_t * services [srv_count ];
23592364 size_t i = 0 ;
23602365 a = _mdns_server -> services ;
@@ -2555,6 +2560,10 @@ static void _mdns_restart_all_pcbs(void)
25552560 srv_count ++ ;
25562561 a = a -> next ;
25572562 }
2563+ if (srv_count == 0 ) {
2564+ _mdns_probe_all_pcbs (NULL , 0 , true, true);
2565+ return ;
2566+ }
25582567 mdns_srv_item_t * services [srv_count ];
25592568 size_t l = 0 ;
25602569 a = _mdns_server -> services ;
@@ -2898,11 +2907,12 @@ static int _mdns_check_srv_collision(mdns_service_t *service, uint16_t priority,
28982907static int _mdns_check_txt_collision (mdns_service_t * service , const uint8_t * data , size_t len )
28992908{
29002909 size_t data_len = 0 ;
2901- if (len == 1 && service -> txt ) {
2910+ if (len <= 1 && service -> txt ) { // len==0 means incorrect packet (and handled by the packet parser)
2911+ // but handled here again to fix clang-tidy warning on VLA "uint8_t our[0];"
29022912 return -1 ;//we win
29032913 } else if (len > 1 && !service -> txt ) {
29042914 return 1 ;//they win
2905- } else if (len = = 1 && !service -> txt ) {
2915+ } else if (len < = 1 && !service -> txt ) {
29062916 return 0 ;//same
29072917 }
29082918
@@ -3788,7 +3798,7 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
37883798 mdns_class &= 0x7FFF ;
37893799
37903800 content = data_ptr + data_len ;
3791- if (content > (data + len )) {
3801+ if (content > (data + len ) || data_len == 0 ) {
37923802 goto clear_rx_packet ;
37933803 }
37943804
@@ -4271,15 +4281,10 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
42714281 free (record );
42724282 }
42734283 free (parsed_packet );
4274- if (browse_result_instance ) {
4275- free (browse_result_instance );
4276- }
4277- if (browse_result_service ) {
4278- free (browse_result_service );
4279- }
4280- if (browse_result_proto ) {
4281- free (browse_result_proto );
4282- }
4284+ free (browse_result_instance );
4285+ free (browse_result_service );
4286+ free (browse_result_proto );
4287+ free (out_sync_browse );
42834288}
42844289
42854290/**
@@ -5346,7 +5351,8 @@ static void _mdns_service_task(void *pvParameters)
53465351 for (;;) {
53475352 if (_mdns_server && _mdns_server -> action_queue ) {
53485353 if (xQueueReceive (_mdns_server -> action_queue , & a , portMAX_DELAY ) == pdTRUE ) {
5349- if (a && a -> type == ACTION_TASK_STOP ) {
5354+ assert (a );
5355+ if (a -> type == ACTION_TASK_STOP ) {
53505356 break ;
53515357 }
53525358 MDNS_SERVICE_LOCK ();
0 commit comments