@@ -512,7 +512,7 @@ public function testParseSOAResponse()
512512 $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
513513 $ data .= "00 06 00 01 " ; // answer: type SOA, class IN
514514 $ data .= "00 01 51 80 " ; // answer: ttl 86400
515- $ data .= "00 07 " ; // answer: rdlength 7
515+ $ data .= "00 27 " ; // answer: rdlength 39
516516 $ data .= "02 6e 73 05 68 65 6c 6c 6f 00 " ; // answer: rdata ns.hello (mname)
517517 $ data .= "01 65 05 68 65 6c 6c 6f 00 " ; // answer: rdata e.hello (rname)
518518 $ data .= "78 49 28 D5 00 00 2a 30 00 00 0e 10 " ; // answer: rdata 2018060501, 10800, 3600
@@ -725,6 +725,184 @@ public function testParseIncompleteAnswerRecordDataThrows()
725725 $ this ->parser ->parseMessage ($ data );
726726 }
727727
728+ public function testParseInvalidNSResponseWhereDomainNameIsMissing ()
729+ {
730+ $ data = "" ;
731+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
732+ $ data .= "00 02 00 01 " ; // answer: type NS, class IN
733+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
734+ $ data .= "00 00 " ; // answer: rdlength 0
735+
736+ $ data = $ this ->convertTcpDumpToBinary ($ data );
737+
738+ $ response = new Message ();
739+ $ response ->header ->set ('anCount ' , 1 );
740+ $ response ->data = $ data ;
741+
742+ $ this ->parser ->parseAnswer ($ response );
743+
744+ $ this ->assertCount (0 , $ response ->answers );
745+ }
746+
747+ public function testParseInvalidAResponseWhereIPIsMissing ()
748+ {
749+ $ data = "" ;
750+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
751+ $ data .= "00 01 00 01 " ; // answer: type A, class IN
752+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
753+ $ data .= "00 00 " ; // answer: rdlength 0
754+
755+ $ data = $ this ->convertTcpDumpToBinary ($ data );
756+
757+ $ response = new Message ();
758+ $ response ->header ->set ('anCount ' , 1 );
759+ $ response ->data = $ data ;
760+
761+ $ this ->parser ->parseAnswer ($ response );
762+
763+ $ this ->assertCount (0 , $ response ->answers );
764+ }
765+
766+ public function testParseInvalidAAAAResponseWhereIPIsMissing ()
767+ {
768+ $ data = "" ;
769+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
770+ $ data .= "00 1c 00 01 " ; // answer: type AAAA, class IN
771+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
772+ $ data .= "00 00 " ; // answer: rdlength 0
773+
774+ $ data = $ this ->convertTcpDumpToBinary ($ data );
775+
776+ $ response = new Message ();
777+ $ response ->header ->set ('anCount ' , 1 );
778+ $ response ->data = $ data ;
779+
780+ $ this ->parser ->parseAnswer ($ response );
781+
782+ $ this ->assertCount (0 , $ response ->answers );
783+ }
784+
785+ public function testParseInvalidTXTResponseWhereTxtChunkExceedsLimit ()
786+ {
787+ $ data = "" ;
788+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
789+ $ data .= "00 10 00 01 " ; // answer: type TXT, class IN
790+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
791+ $ data .= "00 06 " ; // answer: rdlength 6
792+ $ data .= "06 68 65 6c 6c 6f 6f " ; // answer: rdata length 6: helloo
793+
794+ $ data = $ this ->convertTcpDumpToBinary ($ data );
795+
796+ $ response = new Message ();
797+ $ response ->header ->set ('anCount ' , 1 );
798+ $ response ->data = $ data ;
799+
800+ $ this ->parser ->parseAnswer ($ response );
801+
802+ $ this ->assertCount (0 , $ response ->answers );
803+ }
804+
805+ public function testParseInvalidMXResponseWhereDomainNameIsIncomplete ()
806+ {
807+ $ data = "" ;
808+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
809+ $ data .= "00 0f 00 01 " ; // answer: type MX, class IN
810+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
811+ $ data .= "00 08 " ; // answer: rdlength 8
812+ $ data .= "00 0a 05 68 65 6c 6c 6f " ; // answer: rdata priority 10: hello (missing label end)
813+
814+ $ data = $ this ->convertTcpDumpToBinary ($ data );
815+
816+ $ response = new Message ();
817+ $ response ->header ->set ('anCount ' , 1 );
818+ $ response ->data = $ data ;
819+
820+ $ this ->parser ->parseAnswer ($ response );
821+
822+ $ this ->assertCount (0 , $ response ->answers );
823+ }
824+
825+ public function testParseInvalidMXResponseWhereDomainNameIsMissing ()
826+ {
827+ $ data = "" ;
828+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
829+ $ data .= "00 0f 00 01 " ; // answer: type MX, class IN
830+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
831+ $ data .= "00 02 " ; // answer: rdlength 2
832+ $ data .= "00 0a " ; // answer: rdata priority 10
833+
834+ $ data = $ this ->convertTcpDumpToBinary ($ data );
835+
836+ $ response = new Message ();
837+ $ response ->header ->set ('anCount ' , 1 );
838+ $ response ->data = $ data ;
839+
840+ $ this ->parser ->parseAnswer ($ response );
841+
842+ $ this ->assertCount (0 , $ response ->answers );
843+ }
844+
845+ public function testParseInvalidSRVResponseWhereDomainNameIsIncomplete ()
846+ {
847+ $ data = "" ;
848+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
849+ $ data .= "00 21 00 01 " ; // answer: type SRV, class IN
850+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
851+ $ data .= "00 0b " ; // answer: rdlength 11
852+ $ data .= "00 0a 00 14 1F 90 04 74 65 73 74 " ; // answer: rdata priority 10, weight 20, port 8080 test (missing label end)
853+
854+ $ data = $ this ->convertTcpDumpToBinary ($ data );
855+
856+ $ response = new Message ();
857+ $ response ->header ->set ('anCount ' , 1 );
858+ $ response ->data = $ data ;
859+
860+ $ this ->parser ->parseAnswer ($ response );
861+
862+ $ this ->assertCount (0 , $ response ->answers );
863+ }
864+
865+ public function testParseInvalidSRVResponseWhereDomainNameIsMissing ()
866+ {
867+ $ data = "" ;
868+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
869+ $ data .= "00 21 00 01 " ; // answer: type SRV, class IN
870+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
871+ $ data .= "00 06 " ; // answer: rdlength 6
872+ $ data .= "00 0a 00 14 1F 90 " ; // answer: rdata priority 10, weight 20, port 8080
873+
874+ $ data = $ this ->convertTcpDumpToBinary ($ data );
875+
876+ $ response = new Message ();
877+ $ response ->header ->set ('anCount ' , 1 );
878+ $ response ->data = $ data ;
879+
880+ $ this ->parser ->parseAnswer ($ response );
881+
882+ $ this ->assertCount (0 , $ response ->answers );
883+ }
884+
885+ public function testParseInvalidSOAResponseWhereFlagsAreMissing ()
886+ {
887+ $ data = "" ;
888+ $ data .= "04 69 67 6f 72 02 69 6f 00 " ; // answer: igor.io
889+ $ data .= "00 06 00 01 " ; // answer: type SOA, class IN
890+ $ data .= "00 01 51 80 " ; // answer: ttl 86400
891+ $ data .= "00 13 " ; // answer: rdlength 19
892+ $ data .= "02 6e 73 05 68 65 6c 6c 6f 00 " ; // answer: rdata ns.hello (mname)
893+ $ data .= "01 65 05 68 65 6c 6c 6f 00 " ; // answer: rdata e.hello (rname)
894+
895+ $ data = $ this ->convertTcpDumpToBinary ($ data );
896+
897+ $ response = new Message ();
898+ $ response ->header ->set ('anCount ' , 1 );
899+ $ response ->data = $ data ;
900+
901+ $ this ->parser ->parseAnswer ($ response );
902+
903+ $ this ->assertCount (0 , $ response ->answers );
904+ }
905+
728906 private function convertTcpDumpToBinary ($ input )
729907 {
730908 // sudo ngrep -d en1 -x port 53
0 commit comments