]> granicus.if.org Git - pdns/commitdiff
rec: Don't choke on escaped content in getZoneCuts()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 19 Dec 2016 15:27:14 +0000 (16:27 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 22 Dec 2016 09:35:29 +0000 (10:35 +0100)
`getZoneCuts()` was constructing a `DNSName` by passing a raw label returned
from `DNSName::getRawLabels()` as a string. The constructor then tried to handle
escaped characters from the string, resulting in a different `DNSName` than the
expected one. This caused the `qname != begin` condition to be false even after
every label in `labelsToAdd` had been added, causing an UB by calling
`std::vector::back()` on an empty vector.
Using `DNSName::prependRawLabel()` instead prevents this issue since the string is
not escaped.

(cherry picked from commit 754914f0177cd990db16ff0cc29c8789e94b32bb)

pdns/validate.cc

index 3a180a474072eeaa370db0c5484a3bea611e9aa4..e0db5f6cacbbf7e9617fb084e8da2fb7d59c6fd4 100644 (file)
@@ -124,7 +124,7 @@ vector<DNSName> getZoneCuts(const DNSName& begin, const DNSName& end, DNSRecordO
   // The shortest name is assumed to a zone cut
   ret.push_back(qname);
   while(qname != begin) {
-    qname = DNSName(labelsToAdd.back()) + qname;
+    qname.prependRawLabel(labelsToAdd.back());
     labelsToAdd.pop_back();
     bool foundCut = false;
     auto records = dro.get(qname, (uint16_t)QType::NS);