From: Mukund Sivaraman Date: Thu, 30 Jan 2014 06:46:06 +0000 (+0530) Subject: [3286] Clear Message before parsing fromWire() X-Git-Tag: bind10-1.2.0beta1-release~87^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e19305ef4e339db5ac85f1a3c1ba98abee62dd32;p=thirdparty%2Fkea.git [3286] Clear Message before parsing fromWire() --- diff --git a/src/lib/dns/message.cc b/src/lib/dns/message.cc index 2bc337ad6f..0c5cf37385 100644 --- a/src/lib/dns/message.cc +++ b/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); } diff --git a/src/lib/dns/tests/message_unittest.cc b/src/lib/dns/tests/message_unittest.cc index 8aaebaa183..eeeeba73da 100644 --- a/src/lib/dns/tests/message_unittest.cc +++ b/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.