BIND 10 trac2656_2, updated. 17a9c25450a3129fa5787a5deb70d371a602f311 [2656] Update std::string SRV constructor to use the MasterLexer

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jan 29 07:42:36 UTC 2013


The branch, trac2656_2 has been updated
       via  17a9c25450a3129fa5787a5deb70d371a602f311 (commit)
       via  c5efaec3f9196e4b4cabccde691f30ad9de380ba (commit)
      from  ae25fcc7abecb79eb3d4b9df1e0b463c27f77258 (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 17a9c25450a3129fa5787a5deb70d371a602f311
Author: Mukund Sivaraman <muks at isc.org>
Date:   Tue Jan 29 13:12:09 2013 +0530

    [2656] Update std::string SRV constructor to use the MasterLexer

commit c5efaec3f9196e4b4cabccde691f30ad9de380ba
Author: Mukund Sivaraman <muks at isc.org>
Date:   Tue Jan 29 12:50:13 2013 +0530

    [2656] Update std::string DNAME constructor to use the MasterLexer
    
    Also adjust tests.

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

Summary of changes:
 .../tests/memory/rdata_serialization_unittest.cc   |    2 +-
 src/lib/dns/rdata/generic/dname_39.cc              |   21 +++++++++-
 src/lib/dns/rdata/in_1/srv_33.cc                   |   43 ++++++++++++++------
 src/lib/dns/tests/rdata_dname_unittest.cc          |   12 +++---
 src/lib/dns/tests/rdata_srv_unittest.cc            |    2 +-
 src/lib/dns/tests/zone_checker_unittest.cc         |    6 +--
 6 files changed, 60 insertions(+), 26 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc b/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc
index 1e70900..b36b294 100644
--- a/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc
+++ b/src/lib/datasrc/tests/memory/rdata_serialization_unittest.cc
@@ -773,7 +773,7 @@ TEST_F(RdataSerializationTest, badAddRdata) {
 
     // Same as the previous one, opposite inconsistency.
     const ConstRdataPtr dname_rdata =
-        createRdata(RRType::DNAME(), RRClass::IN(), "dname.example");
+        createRdata(RRType::DNAME(), RRClass::IN(), "dname.example.");
     encoder_.start(RRClass::IN(), RRType::NS());
     EXPECT_THROW(encoder_.addRdata(*dname_rdata), isc::BadValue);
 
diff --git a/src/lib/dns/rdata/generic/dname_39.cc b/src/lib/dns/rdata/generic/dname_39.cc
index ea77d42..5bd81f5 100644
--- a/src/lib/dns/rdata/generic/dname_39.cc
+++ b/src/lib/dns/rdata/generic/dname_39.cc
@@ -32,8 +32,25 @@ using isc::dns::rdata::generic::detail::createNameFromLexer;
 // BEGIN_RDATA_NAMESPACE
 
 DNAME::DNAME(const std::string& namestr) :
-    dname_(namestr)
-{}
+    // Fill in dummy name and replace it soon below.
+    dname_(Name::ROOT_NAME())
+{
+    try {
+        std::istringstream ss(namestr);
+        MasterLexer lexer;
+        lexer.pushSource(ss);
+
+        dname_ = createNameFromLexer(lexer, NULL);
+
+        if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) {
+            isc_throw(InvalidRdataText, "extra input text for DNAME: "
+                      << namestr);
+        }
+    } catch (const MasterLexer::LexerError& ex) {
+        isc_throw(InvalidRdataText, "Failed to construct DNAME from '" <<
+                  namestr << "': " << ex.what());
+    }
+}
 
 DNAME::DNAME(InputBuffer& buffer, size_t) :
     dname_(buffer)
diff --git a/src/lib/dns/rdata/in_1/srv_33.cc b/src/lib/dns/rdata/in_1/srv_33.cc
index 7166e14..17e6703 100644
--- a/src/lib/dns/rdata/in_1/srv_33.cc
+++ b/src/lib/dns/rdata/in_1/srv_33.cc
@@ -73,23 +73,40 @@ struct SRVImpl {
 SRV::SRV(const std::string& srv_str) :
     impl_(NULL)
 {
-    istringstream iss(srv_str);
-
     try {
-        const int32_t priority = tokenToNum<int32_t, 16>(getToken(iss));
-        const int32_t weight = tokenToNum<int32_t, 16>(getToken(iss));
-        const int32_t port = tokenToNum<int32_t, 16>(getToken(iss));
-        const Name targetname(getToken(iss));
-
-        if (!iss.eof()) {
-            isc_throw(InvalidRdataText, "Unexpected input for SRV RDATA: " <<
-                    srv_str);
+        std::istringstream ss(srv_str);
+        MasterLexer lexer;
+        lexer.pushSource(ss);
+
+        uint32_t num = lexer.getNextToken(MasterToken::NUMBER).getNumber();
+        if (num > 65535) {
+            isc_throw(InvalidRdataText, "Invalid SRV priority");
+        }
+        const uint16_t priority = static_cast<uint16_t>(num);
+
+        num = lexer.getNextToken(MasterToken::NUMBER).getNumber();
+        if (num > 65535) {
+            isc_throw(InvalidRdataText, "Invalid SRV weight");
+        }
+        const uint16_t weight = static_cast<uint16_t>(num);
+
+        num = lexer.getNextToken(MasterToken::NUMBER).getNumber();
+        if (num > 65535) {
+            isc_throw(InvalidRdataText, "Invalid SRV port");
+        }
+        const uint16_t port = static_cast<uint16_t>(num);
+
+        const Name targetname = createNameFromLexer(lexer, NULL);
+
+        if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) {
+            isc_throw(InvalidRdataText, "extra input text for SRV: "
+                      << srv_str);
         }
 
         impl_ = new SRVImpl(priority, weight, port, targetname);
-    } catch (const StringTokenError& ste) {
-        isc_throw(InvalidRdataText, "Invalid SRV text: " <<
-                  ste.what() << ": " << srv_str);
+    } catch (const MasterLexer::LexerError& ex) {
+        isc_throw(InvalidRdataText, "Failed to construct SRV from '" <<
+                  srv_str << "': " << ex.what());
     }
 }
 
diff --git a/src/lib/dns/tests/rdata_dname_unittest.cc b/src/lib/dns/tests/rdata_dname_unittest.cc
index 1dc3fec..00fe805 100644
--- a/src/lib/dns/tests/rdata_dname_unittest.cc
+++ b/src/lib/dns/tests/rdata_dname_unittest.cc
@@ -36,8 +36,8 @@ class Rdata_DNAME_Test : public RdataTest {
     // there's nothing to specialize
 };
 
-const generic::DNAME rdata_dname("dn.example.com");
-const generic::DNAME rdata_dname2("dn2.example.com");
+const generic::DNAME rdata_dname("dn.example.com.");
+const generic::DNAME rdata_dname2("dn2.example.com.");
 const uint8_t wiredata_dname[] = {
     0x02, 0x64, 0x6e, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x03,
     0x63, 0x6f, 0x6d, 0x00 };
@@ -52,16 +52,16 @@ const uint8_t wiredata_dname2[] = {
     0x63, 0x6f, 0x6d, 0x00 };
 
 TEST_F(Rdata_DNAME_Test, createFromText) {
-    EXPECT_EQ(0, rdata_dname.compare(generic::DNAME("dn.example.com")));
+    EXPECT_EQ(0, rdata_dname.compare(generic::DNAME("dn.example.com.")));
     // explicitly add a trailing dot.  should be the same RDATA.
     EXPECT_EQ(0, rdata_dname.compare(generic::DNAME("dn.example.com.")));
     // should be case sensitive.
-    EXPECT_EQ(0, rdata_dname.compare(generic::DNAME("DN.EXAMPLE.COM")));
+    EXPECT_EQ(0, rdata_dname.compare(generic::DNAME("DN.EXAMPLE.COM.")));
     // RDATA of a class-independent type should be recognized for any
     // "unknown" class.
     EXPECT_EQ(0, rdata_dname.compare(*createRdata(RRType("DNAME"),
                                                   RRClass(65000),
-                                                  "dn.example.com")));
+                                                  "dn.example.com.")));
 }
 
 TEST_F(Rdata_DNAME_Test, createFromWire) {
@@ -81,7 +81,7 @@ TEST_F(Rdata_DNAME_Test, createFromWire) {
                                       "rdata_dname_fromWire", 71),
                  DNSMessageFORMERR);
 
-    EXPECT_EQ(0, generic::DNAME("dn2.example.com").compare(
+    EXPECT_EQ(0, generic::DNAME("dn2.example.com.").compare(
                   *rdataFactoryFromFile(RRType("DNAME"), RRClass("IN"),
                                         "rdata_dname_fromWire", 55)));
     EXPECT_THROW(*rdataFactoryFromFile(RRType("DNAME"), RRClass("IN"),
diff --git a/src/lib/dns/tests/rdata_srv_unittest.cc b/src/lib/dns/tests/rdata_srv_unittest.cc
index 5c79980..534530d 100644
--- a/src/lib/dns/tests/rdata_srv_unittest.cc
+++ b/src/lib/dns/tests/rdata_srv_unittest.cc
@@ -39,7 +39,7 @@ class Rdata_SRV_Test : public RdataTest {
 string srv_txt("1 5 1500 a.example.com.");
 string srv_txt2("1 5 1400 example.com.");
 string too_long_label("012345678901234567890123456789"
-    "0123456789012345678901234567890123");
+    "0123456789012345678901234567890123.");
 
 // 1 5 1500 a.example.com.
 const uint8_t wiredata_srv[] = {
diff --git a/src/lib/dns/tests/zone_checker_unittest.cc b/src/lib/dns/tests/zone_checker_unittest.cc
index ba2c69d..320cda6 100644
--- a/src/lib/dns/tests/zone_checker_unittest.cc
+++ b/src/lib/dns/tests/zone_checker_unittest.cc
@@ -309,7 +309,7 @@ TEST_F(ZoneCheckerTest, checkNSWithDNAME) {
     ns_->addRdata(generic::NS(ns_name));
     rrsets_->addRRset(ns_);
     RRsetPtr dname(new RRset(zname_, zclass_, RRType::DNAME(), RRTTL(60)));
-    dname->addRdata(generic::DNAME("example.org"));
+    dname->addRdata(generic::DNAME("example.org."));
     rrsets_->addRRset(dname);
     EXPECT_FALSE(checkZone(zname_, zclass_, *rrsets_, callbacks_));
     expected_errors_.push_back("zone example.com/IN: NS 'ns.child.example.com'"
@@ -320,7 +320,7 @@ TEST_F(ZoneCheckerTest, checkNSWithDNAME) {
     rrsets_->removeRRset(zname_, zclass_, RRType::DNAME());
     dname.reset(new RRset(Name("child.example.com"), zclass_, RRType::DNAME(),
                           RRTTL(60)));
-    dname->addRdata(generic::DNAME("example.org"));
+    dname->addRdata(generic::DNAME("example.org."));
     rrsets_->addRRset(dname);
     EXPECT_FALSE(checkZone(zname_, zclass_, *rrsets_, callbacks_));
     expected_errors_.push_back("zone example.com/IN: NS 'ns.child.example.com'"
@@ -342,7 +342,7 @@ TEST_F(ZoneCheckerTest, checkNSWithDNAME) {
     rrsets_->removeRRset(dname->getName(), zclass_, RRType::DNAME());
     rrsets_->removeRRset(ns_->getName(), zclass_, RRType::NS());
     dname.reset(new RRset(ns_name, zclass_, RRType::DNAME(), RRTTL(60)));
-    dname->addRdata(generic::DNAME("example.org"));
+    dname->addRdata(generic::DNAME("example.org."));
     rrsets_->addRRset(dname);
     EXPECT_TRUE(checkZone(zname_, zclass_, *rrsets_, callbacks_));
     expected_warns_.push_back("zone example.com/IN: NS has no address");



More information about the bind10-changes mailing list