@@ -493,11 +493,11 @@ void MDNSResponder::_parsePacket(){
493
493
return ;
494
494
}
495
495
496
- int numAnswers = packetHeader[3 ];
496
+ int numAnswers = packetHeader[3 ] + packetHeader[ 5 ] ;
497
497
// Assume that the PTR answer always comes first and that it is always accompanied by a TXT, SRV, AAAA (optional) and A answer in the same packet.
498
498
if (numAnswers < 4 ) {
499
499
#ifdef MDNS_DEBUG_RX
500
- Serial.println (" Expected a packet with 4 answers, returning " );
500
+ Serial.printf (" Expected a packet with 4 or more answers, got %u \n " , numAnswers );
501
501
#endif
502
502
_conn->flush ();
503
503
return ;
@@ -510,11 +510,14 @@ void MDNSResponder::_parsePacket(){
510
510
bool serviceMatch = false ;
511
511
MDNSAnswer *answer;
512
512
uint8_t partsCollected = 0 ;
513
+ uint8_t stringsRead = 0 ;
514
+
515
+ answerHostName[0 ] = ' \0 ' ;
513
516
514
517
// Clear answer list
515
518
if (_newQuery) {
516
- int numAnswers = _getNumAnswers ();
517
- for (int n = numAnswers - 1 ; n >= 0 ; n--) {
519
+ int oldAnswers = _getNumAnswers ();
520
+ for (int n = oldAnswers - 1 ; n >= 0 ; n--) {
518
521
answer = _getAnswerFromIdx (n);
519
522
os_free (answer->hostname );
520
523
os_free (answer);
@@ -526,21 +529,29 @@ void MDNSResponder::_parsePacket(){
526
529
527
530
while (numAnswers--) {
528
531
// Read name
532
+ stringsRead = 0 ;
529
533
do {
530
534
tmp8 = _conn_read8 ();
531
535
if (tmp8 & 0xC0 ) { // Compressed pointer (not supported)
532
536
tmp8 = _conn_read8 ();
533
537
break ;
534
538
}
535
- if (tmp8 == 0x00 ) { // Énd of name
539
+ if (tmp8 == 0x00 ) { // End of name
536
540
break ;
537
541
}
542
+ if (stringsRead > 3 ){
543
+ #ifdef MDNS_DEBUG_RX
544
+ Serial.println (" failed to read the response name" );
545
+ #endif
546
+ _conn->flush ();
547
+ return ;
548
+ }
538
549
_conn_readS (serviceName, tmp8);
539
550
serviceName[tmp8] = ' \0 ' ;
540
551
#ifdef MDNS_DEBUG_RX
541
552
Serial.printf (" %d " , tmp8);
542
553
for (int n = 0 ; n < tmp8; n++) {
543
- Serial.printf (" %02x " , serviceName[n]);
554
+ Serial.printf (" %c " , serviceName[n]);
544
555
}
545
556
Serial.println ();
546
557
#endif
@@ -552,23 +563,41 @@ void MDNSResponder::_parsePacket(){
552
563
#endif
553
564
}
554
565
}
566
+ stringsRead++;
555
567
} while (true );
556
568
557
569
uint16_t answerType = _conn_read16 (); // Read type
558
570
uint16_t answerClass = _conn_read16 (); // Read class
559
571
uint32_t answerTtl = _conn_read32 (); // Read ttl
560
572
uint16_t answerRdlength = _conn_read16 (); // Read rdlength
561
573
574
+ if (answerRdlength > 255 ){
575
+ if (answerType == MDNS_TYPE_TXT && answerRdlength < 1460 ){
576
+ while (--answerRdlength) _conn->read ();
577
+ } else {
578
+ #ifdef MDNS_DEBUG_RX
579
+ Serial.printf (" Data len too long! %u\n " , answerRdlength);
580
+ #endif
581
+ _conn->flush ();
582
+ return ;
583
+ }
584
+ }
585
+
562
586
#ifdef MDNS_DEBUG_RX
563
587
Serial.printf (" type: %04x rdlength: %d\n " , answerType, answerRdlength);
564
588
#endif
565
589
566
590
if (answerType == MDNS_TYPE_PTR) {
567
591
partsCollected |= 0x01 ;
568
592
_conn_readS (hostName, answerRdlength); // Read rdata
593
+ if (hostName[answerRdlength-2 ] & 0xc0 ){
594
+ memcpy (answerHostName, hostName+1 , answerRdlength-3 );
595
+ answerHostName[answerRdlength-3 ] = ' \0 ' ;
596
+ }
569
597
#ifdef MDNS_DEBUG_RX
598
+ Serial.printf (" PTR %d " , answerRdlength);
570
599
for (int n = 0 ; n < answerRdlength; n++) {
571
- Serial.printf (" %02x " , hostName[n]);
600
+ Serial.printf (" %c " , hostName[n]);
572
601
}
573
602
Serial.println ();
574
603
#endif
@@ -578,8 +607,9 @@ void MDNSResponder::_parsePacket(){
578
607
partsCollected |= 0x02 ;
579
608
_conn_readS (hostName, answerRdlength); // Read rdata
580
609
#ifdef MDNS_DEBUG_RX
610
+ Serial.printf (" TXT %d " , answerRdlength);
581
611
for (int n = 0 ; n < answerRdlength; n++) {
582
- Serial.printf (" %02x " , hostName[n]);
612
+ Serial.printf (" %c " , hostName[n]);
583
613
}
584
614
Serial.println ();
585
615
#endif
@@ -594,14 +624,16 @@ void MDNSResponder::_parsePacket(){
594
624
// Read hostname
595
625
tmp8 = _conn_read8 ();
596
626
if (tmp8 & 0xC0 ) { // Compressed pointer (not supported)
627
+ #ifdef MDNS_DEBUG_RX
597
628
Serial.println (" Skipping compressed pointer" );
629
+ #endif
598
630
tmp8 = _conn_read8 ();
599
631
}
600
632
else {
601
633
_conn_readS (answerHostName, tmp8);
602
634
answerHostName[tmp8] = ' \0 ' ;
603
635
#ifdef MDNS_DEBUG_RX
604
- Serial.printf (" %d " , tmp8);
636
+ Serial.printf (" SRV %d " , tmp8);
605
637
for (int n = 0 ; n < tmp8; n++) {
606
638
Serial.printf (" %02x " , answerHostName[n]);
607
639
}
@@ -621,7 +653,7 @@ void MDNSResponder::_parsePacket(){
621
653
}
622
654
else {
623
655
#ifdef MDNS_DEBUG_RX
624
- Serial.printf (" Ignoring unsupported type %d \n " , tmp8);
656
+ Serial.printf (" Ignoring unsupported type %02x \n " , tmp8);
625
657
#endif
626
658
for (int n = 0 ; n < answerRdlength; n++)
627
659
(void )_conn_read8 ();
@@ -654,6 +686,8 @@ void MDNSResponder::_parsePacket(){
654
686
}
655
687
answer->hostname = (char *)os_malloc (strlen (answerHostName) + 1 );
656
688
os_strcpy (answer->hostname , answerHostName);
689
+ _conn->flush ();
690
+ return ;
657
691
}
658
692
}
659
693
@@ -663,7 +697,7 @@ void MDNSResponder::_parsePacket(){
663
697
664
698
// PARSE REQUEST NAME
665
699
666
- hostNameLen = _conn_read8 ();
700
+ hostNameLen = _conn_read8 () % 255 ;
667
701
_conn_readS (hostName, hostNameLen);
668
702
hostName[hostNameLen] = ' \0 ' ;
669
703
@@ -685,7 +719,7 @@ void MDNSResponder::_parsePacket(){
685
719
}
686
720
687
721
if (!serviceParsed){
688
- serviceNameLen = _conn_read8 ();
722
+ serviceNameLen = _conn_read8 () % 255 ;
689
723
_conn_readS (serviceName, serviceNameLen);
690
724
serviceName[serviceNameLen] = ' \0 ' ;
691
725
@@ -718,7 +752,7 @@ void MDNSResponder::_parsePacket(){
718
752
}
719
753
720
754
if (!protoParsed){
721
- protoNameLen = _conn_read8 ();
755
+ protoNameLen = _conn_read8 () % 255 ;
722
756
_conn_readS (protoName, protoNameLen);
723
757
protoName[protoNameLen] = ' \0 ' ;
724
758
if (protoNameLen == 4 && protoName[0 ] == ' _' ){
@@ -740,7 +774,7 @@ void MDNSResponder::_parsePacket(){
740
774
741
775
if (!localParsed){
742
776
char localName[32 ];
743
- uint8_t localNameLen = _conn_read8 ();
777
+ uint8_t localNameLen = _conn_read8 () % 31 ;
744
778
_conn_readS (localName, localNameLen);
745
779
localName[localNameLen] = ' \0 ' ;
746
780
tmp = _conn_read8 ();
0 commit comments