Browse Source

[3286] Clear Message before parsing fromWire()

Mukund Sivaraman 11 years ago
parent
commit
e19305ef4e
2 changed files with 26 additions and 6 deletions
  1. 3 0
      src/lib/dns/message.cc
  2. 23 6
      src/lib/dns/tests/message_unittest.cc

+ 3 - 0
src/lib/dns/message.cc

@@ -645,6 +645,9 @@ Message::fromWire(InputBuffer& buffer, ParseOptions options) {
                   "Message parse attempted in non parse mode");
     }
 
+    // Clear any old parsed data
+    clear(Message::PARSE);
+
     if (!impl_->header_parsed_) {
         parseHeader(buffer);
     }

+ 23 - 6
src/lib/dns/tests/message_unittest.cc

@@ -572,12 +572,10 @@ TEST_F(MessageTest, parseHeader) {
                 message_parse.endSection(Message::SECTION_ADDITIONAL));
 }
 
-TEST_F(MessageTest, fromWire) {
-    // fromWire() isn't allowed in the render mode.
-    EXPECT_THROW(factoryFromFile(message_render, "message_fromWire1"),
-                 InvalidMessageOperation);
-
-    factoryFromFile(message_parse, "message_fromWire1");
+void
+checkMessageFromWire(const Message& message_parse,
+                     const Name& test_name)
+{
     EXPECT_EQ(0x1035, message_parse.getQid());
     EXPECT_EQ(Opcode::QUERY(), message_parse.getOpcode());
     EXPECT_EQ(Rcode::NOERROR(), message_parse.getRcode());
@@ -608,6 +606,25 @@ TEST_F(MessageTest, fromWire) {
     EXPECT_TRUE(it->isLast());
 }
 
+
+TEST_F(MessageTest, fromWire) {
+    // fromWire() isn't allowed in the render mode.
+    EXPECT_THROW(factoryFromFile(message_render, "message_fromWire1"),
+                 InvalidMessageOperation);
+
+    factoryFromFile(message_parse, "message_fromWire1");
+    checkMessageFromWire(message_parse, test_name);
+}
+
+TEST_F(MessageTest, fromWireMultiple) {
+    // Parse from wire multiple times.
+    factoryFromFile(message_parse, "message_fromWire1");
+    factoryFromFile(message_parse, "message_fromWire1");
+    factoryFromFile(message_parse, "message_fromWire1");
+    factoryFromFile(message_parse, "message_fromWire1");
+    checkMessageFromWire(message_parse, test_name);
+}
+
 TEST_F(MessageTest, fromWireShortBuffer) {
     // We trim a valid message (ending with an SOA RR) for one byte.
     // fromWire() should throw an exception while parsing the trimmed RR.