]> granicus.if.org Git - pdns/commitdiff
Aki Tuomi discovered that the zoneparser messes up 'blah IN MX 15 @'. Fixed.
authorBert Hubert <bert.hubert@netherlabs.nl>
Fri, 28 May 2010 12:26:38 +0000 (12:26 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Fri, 28 May 2010 12:26:38 +0000 (12:26 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1621 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/misc.hh
pdns/zoneparser-tng.cc

index ce83248eb3737e30b7e81e196042b1611aa0a0c1..4b138da6220265cdd79e93b338149984cd3a60b8 100644 (file)
@@ -363,6 +363,9 @@ inline bool isCanonical(const string& dom)
 
 inline string toCanonic(const string& zone, const string& domain)
 {
+  if(domain.length()==1 && domain[0]=='@')
+    return zone;
+
   if(isCanonical(domain))
     return domain;
   string ret=domain;
index 3c52cc327b980f1fb37eb86e6fbd82b96a9ff3a1..a224d935e11b27d81be551fe18f89890ffd80843 100644 (file)
@@ -225,6 +225,7 @@ string ZoneParserTNG::getLineOfFile()
   return "on line "+lexical_cast<string>(d_filestates.top().d_lineno)+" of file '"+d_filestates.top().d_filename+"'";
 }
 
+// ODD: this function never fills out the prio field! rest of pdns compensates though
 bool ZoneParserTNG::get(DNSResourceRecord& rr) 
 {
  retry:;
@@ -365,9 +366,16 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
     }
   }
 
-  vector<string> soaparts;
+  vector<string> recparts;
   switch(rr.qtype.getCode()) {
   case QType::MX:
+    stringtok(recparts, rr.content);
+    if(recparts.size()==2) {
+      recparts[1] = toCanonic(d_zonename, recparts[1]);
+      rr.content=recparts[0]+" "+recparts[1];
+    }
+    break;
+    
   case QType::NS:
   case QType::CNAME:
   case QType::PTR:
@@ -377,23 +385,23 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr)
     break;
 
   case QType::SOA:
-    stringtok(soaparts, rr.content);
-    if(soaparts.size() > 1) {
-      soaparts[0]=toCanonic(d_zonename, soaparts[0]);
-      soaparts[1]=toCanonic(d_zonename, soaparts[1]);
+    stringtok(recparts, rr.content);
+    if(recparts.size() > 1) {
+      recparts[0]=toCanonic(d_zonename, recparts[0]);
+      recparts[1]=toCanonic(d_zonename, recparts[1]);
     }
     rr.content.clear();
-    for(string::size_type n = 0; n < soaparts.size(); ++n) {
+    for(string::size_type n = 0; n < recparts.size(); ++n) {
       if(n)
         rr.content.append(1,' ');
 
       if(n > 1)
-        rr.content+=lexical_cast<string>(makeTTLFromZone(soaparts[n]));
+        rr.content+=lexical_cast<string>(makeTTLFromZone(recparts[n]));
       else
-        rr.content+=soaparts[n];
+        rr.content+=recparts[n];
 
       if(n==6 && !d_havedollarttl)
-        d_defaultttl=makeTTLFromZone(soaparts[n]);
+        d_defaultttl=makeTTLFromZone(recparts[n]);
     }
     break;
   default:;