BIND 10 trac3286, updated. 040a4aec3997990a3da8061f20d714060716b8d6 [3286] Make fromWire() always start reading from position 0 in the passed buffer

BIND 10 source code commits bind10-changes at lists.isc.org
Thu Jan 30 13:23:20 UTC 2014


The branch, trac3286 has been updated
       via  040a4aec3997990a3da8061f20d714060716b8d6 (commit)
      from  e19305ef4e339db5ac85f1a3c1ba98abee62dd32 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 040a4aec3997990a3da8061f20d714060716b8d6
Author: Mukund Sivaraman <muks at isc.org>
Date:   Thu Jan 30 18:38:08 2014 +0530

    [3286] Make fromWire() always start reading from position 0 in the passed buffer
    
    This fixes a bug which occurs if parseHeader() is called separately from
    fromWire().

-----------------------------------------------------------------------

Summary of changes:
 src/lib/dns/message.cc                |    9 ++++++---
 src/lib/dns/message.h                 |    7 ++++++-
 src/lib/dns/tests/message_unittest.cc |   12 ++++++++++++
 3 files changed, 24 insertions(+), 4 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/dns/message.cc b/src/lib/dns/message.cc
index 0c5cf37..8487cf5 100644
--- a/src/lib/dns/message.cc
+++ b/src/lib/dns/message.cc
@@ -620,6 +620,10 @@ Message::parseHeader(InputBuffer& buffer) {
                   "Message parse attempted in non parse mode");
     }
 
+    if (impl_->header_parsed_) {
+        return;
+    }
+
     if ((buffer.getLength() - buffer.getPosition()) < HEADERLEN) {
         isc_throw(MessageTooShort, "Malformed DNS message (short length): "
                   << buffer.getLength() - buffer.getPosition());
@@ -648,9 +652,8 @@ Message::fromWire(InputBuffer& buffer, ParseOptions options) {
     // Clear any old parsed data
     clear(Message::PARSE);
 
-    if (!impl_->header_parsed_) {
-        parseHeader(buffer);
-    }
+    buffer.setPosition(0);
+    parseHeader(buffer);
 
     impl_->counts_[SECTION_QUESTION] = impl_->parseQuestion(buffer);
     impl_->counts_[SECTION_ANSWER] =
diff --git a/src/lib/dns/message.h b/src/lib/dns/message.h
index aaa0d76..17cf88b 100644
--- a/src/lib/dns/message.h
+++ b/src/lib/dns/message.h
@@ -607,6 +607,10 @@ public:
     };
 
     /// \brief Parse the header section of the \c Message.
+    ///
+    /// NOTE: If the header has already been parsed by a previous call
+    /// to this method, this method simply returns (i.e., it does not
+    /// read from the \c buffer).
     void parseHeader(isc::util::InputBuffer& buffer);
 
     /// \brief (Re)build a \c Message object from wire-format data.
@@ -642,7 +646,8 @@ public:
     /// \exception std::bad_alloc Memory allocation failure
     /// \exception Others \c Name, \c Rdata, and \c EDNS classes can also throw
     ///
-    /// \param buffer A input buffer object that stores the wire data
+    /// \param buffer A input buffer object that stores the wire
+    /// data. This method reads from position 0 in the passed buffer.
     /// \param options Parse options
     void fromWire(isc::util::InputBuffer& buffer, ParseOptions options
         = PARSE_DEFAULT);
diff --git a/src/lib/dns/tests/message_unittest.cc b/src/lib/dns/tests/message_unittest.cc
index eeeeba7..61f2e11 100644
--- a/src/lib/dns/tests/message_unittest.cc
+++ b/src/lib/dns/tests/message_unittest.cc
@@ -623,6 +623,18 @@ TEST_F(MessageTest, fromWireMultiple) {
     factoryFromFile(message_parse, "message_fromWire1");
     factoryFromFile(message_parse, "message_fromWire1");
     checkMessageFromWire(message_parse, test_name);
+
+    // Calling parseHeader() directly before fromWire() should not cause
+    // any problems.
+    received_data.clear();
+    UnitTestUtil::readWireData("message_fromWire1", received_data);
+
+    InputBuffer buffer(&received_data[0], received_data.size());
+    message_parse.parseHeader(buffer);
+    message_parse.fromWire(buffer);
+    message_parse.parseHeader(buffer);
+    message_parse.fromWire(buffer);
+    checkMessageFromWire(message_parse, test_name);
 }
 
 TEST_F(MessageTest, fromWireShortBuffer) {



More information about the bind10-changes mailing list