@@ -602,3 +602,56 @@ TEST_F(DNSTest, BadLabelSize) {
602
602
SUCCEED ();
603
603
}
604
604
}
605
+
606
+ TEST_F (DNSTest, BadPacketLength) {
607
+
608
+ // valid response packet with RR's in all sections
609
+ const uint8_t payload[] = {
610
+ 0x74 ,0xa9 ,0x85 ,0x80 ,0x00 ,0x01 ,0x00 ,0x02 ,0x00 ,0x01 ,0x00 ,0x04 ,0x08 ,0x5f ,0x73 ,0x65 ,0x72 ,
611
+ 0x76 ,0x69 ,0x63 ,0x65 ,0x04 ,0x5f ,0x74 ,0x63 ,0x70 ,0x05 ,0x77 ,0x69 ,0x66 ,0x69 ,0x36 ,0x03 ,
612
+ 0x6c ,0x61 ,0x6e ,0x00 ,0x00 ,0x21 ,0x00 ,0x01 ,0xc0 ,0x0c ,0x00 ,0x21 ,0x00 ,0x01 ,0x00 ,0x01 ,
613
+ 0x51 ,0x80 ,0x00 ,0x16 ,0x00 ,0x00 ,0x00 ,0x03 ,0x00 ,0x09 ,0x04 ,0x66 ,0x61 ,0x73 ,0x74 ,0x05 ,
614
+ 0x77 ,0x69 ,0x66 ,0x69 ,0x36 ,0x03 ,0x6c ,0x61 ,0x6e ,0x00 ,0xc0 ,0x0c ,0x00 ,0x21 ,0x00 ,0x01 ,
615
+ 0x00 ,0x01 ,0x51 ,0x80 ,0x00 ,0x16 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x09 ,0x04 ,0x73 ,0x6c ,0x6f ,
616
+ 0x77 ,0x05 ,0x77 ,0x69 ,0x66 ,0x69 ,0x36 ,0x03 ,0x6c ,0x61 ,0x6e ,0x00 ,0xc0 ,0x62 ,0x00 ,0x02 ,
617
+ 0x00 ,0x01 ,0x00 ,0x01 ,0x51 ,0x80 ,0x00 ,0x05 ,0x02 ,0x70 ,0x69 ,0xc0 ,0x62 ,0xc0 ,0x5d ,0x00 ,
618
+ 0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x51 ,0x80 ,0x00 ,0x04 ,0x0a ,0x18 ,0x00 ,0x02 ,0xc0 ,0x3b ,0x00 ,
619
+ 0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x51 ,0x80 ,0x00 ,0x04 ,0x0a ,0x18 ,0x00 ,0x02 ,0xc0 ,0x79 ,0x00 ,
620
+ 0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x51 ,0x80 ,0x00 ,0x04 ,0x0a ,0x18 ,0x00 ,0x02 ,0x00 ,0x00 ,0x29 ,
621
+ 0x10 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1c ,0x00 ,0x0a ,0x00 ,0x18 ,0x86 ,0x1f ,0x14 ,0x0f ,
622
+ 0x41 ,0xfa ,0xf3 ,0x95 ,0x48 ,0x6e ,0x79 ,0x61 ,0x61 ,0x78 ,0x32 ,0x0f ,0x44 ,0x5d ,0x21 ,0x47 ,
623
+ 0x85 ,0x83 ,0x9a ,0x95
624
+ };
625
+
626
+ // valid DNS message but misreport packet size;
627
+ // before fix, parser headed into uncharted waters on requesting additional section
628
+
629
+ // buffer with space for valid packet plus garbage bytes
630
+ const size_t bigsz{512 };
631
+ uint8_t big_packet[bigsz];
632
+
633
+ // copy valid packet
634
+ std::copy (payload,
635
+ payload + sizeof (payload),
636
+ big_packet);
637
+
638
+ // fill additional bytes with junk
639
+ std::fill (big_packet + sizeof (payload),
640
+ big_packet + bigsz,
641
+ 0x5A );
642
+
643
+ // initial packet parse ok
644
+ const DNS packet (big_packet, bigsz);
645
+
646
+ // RR's parse ok now
647
+ EXPECT_EQ (packet.questions_count (), 1 );
648
+ EXPECT_EQ (packet.answers_count (), 2 );
649
+ EXPECT_EQ (packet.authority_count (), 1 );
650
+ EXPECT_EQ (packet.additional_count (), 4 );
651
+ EXPECT_EQ (packet.queries ().size (), 1U );
652
+ EXPECT_EQ (packet.answers ().size (), 2U );
653
+ EXPECT_EQ (packet.authority ().size (), 1U );
654
+ EXPECT_EQ (packet.additional ().size (), 4U );
655
+ }
656
+
657
+
0 commit comments