]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2383] Append the origin if relative
authorMichal 'vorner' Vaner <michal.vaner@nic.cz>
Tue, 30 Oct 2012 12:41:55 +0000 (13:41 +0100)
committerMichal 'vorner' Vaner <michal.vaner@nic.cz>
Tue, 30 Oct 2012 12:46:49 +0000 (13:46 +0100)
Add the origin to the parsed name if the parsed name is relative. Also,
add the checks for the combined length and fix a test for them.

src/lib/dns/name.cc
src/lib/dns/tests/name_unittest.cc

index 6e6a704d0cfbbf1f1efa5671901c2a2cb95d2d12..11d5d12262d743e763339b3ad3b0d7d3564dd5e4 100644 (file)
@@ -353,6 +353,37 @@ Name::Name(const char* namedata, size_t data_len, const Name* origin,
     ndata_.assign(ndata.data(), ndata.size());
     length_ = ndata_.size();
     offsets_.assign(offsets.begin(), offsets.end());
+
+    if (!absolute) {
+        // Now, extend the data with the ones from origin. But eat the
+        // last label (the empty one).
+
+        // Drop the last character of the data (the \0) and append a copy of
+        // the origin's data
+        ndata_.erase(ndata_.end() - 1);
+        ndata_.append(origin->ndata_);
+
+        // Do a similar thing with offsets. However, we need to move them
+        // so they point after the prefix we parsed before.
+        size_t offset = offsets_.back();
+        offsets_.pop_back();
+        size_t offset_count = offsets_.size();
+        offsets_.insert(offsets_.end(), origin->offsets_.begin(),
+                        origin->offsets_.end());
+        for (NameOffsets::iterator it(offsets_.begin() + offset_count);
+             it != offsets_.end(); ++it) {
+            *it += offset;
+        }
+
+        // Adjust sizes.
+        length_ = ndata_.size();
+        labelcount_ = offsets_.size();
+
+        // And check the sizes are OK.
+        if (labelcount_ > Name::MAX_LABELS || length_ > Name::MAX_WIRE) {
+            isc_throw(TooLongName, "Combined name is too long");
+        }
+    }
 }
 
 namespace {
index d2a16847faf2d5869c9881c8b9daad444119e7de..11ac929edb9b1189256e558a531997e08bd629a9 100644 (file)
@@ -47,7 +47,7 @@ const char* max_labels_str = "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 40
                              "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 160
                              "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 200
                              "0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9." // 240
-                             "0.1.2.3.4.5.6.";
+                             "0.1.2.3.4.5.6";
 // This is a name of maximum allowed length
 const char* max_len_str = "123456789.123456789.123456789.123456789.123456789."
                           "123456789.123456789.123456789.123456789.123456789."