]> granicus.if.org Git - pdns/commitdiff
Add a `lenField` option to xfrText()
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 1 Dec 2015 16:19:56 +0000 (17:19 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 15 Mar 2016 13:19:10 +0000 (14:19 +0100)
This option (true by default) tells the writer/parser to add/read a
byte that is the length of the data following.

pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/dnswriter.cc
pdns/dnswriter.hh
pdns/rcpgenerator.cc
pdns/rcpgenerator.hh

index 499ddea211c114145b5935e158f6899db9b2f168..405933c83aa10cbb610f611df3271da0c78af092 100644 (file)
@@ -439,7 +439,7 @@ static string txtEscape(const string &name)
 }
 
 // exceptions thrown here do not result in logging in the main pdns auth server - just so you know!
-string PacketReader::getText(bool multi)
+string PacketReader::getText(bool multi, bool lenField)
 {
   string ret;
   ret.reserve(40);
@@ -447,7 +447,11 @@ string PacketReader::getText(bool multi)
     if(!ret.empty()) {
       ret.append(1,' ');
     }
-    unsigned char labellen=d_content.at(d_pos++);
+    uint16_t labellen;
+    if(lenField)
+      labellen=d_content.at(d_pos++);
+    else
+      labellen=d_recordlen - (d_pos - d_startrecordpos);
     
     ret.append(1,'"');
     if(labellen) { // no need to do anything for an empty string
index 88e02d3ddf573aa1751c0cde6bf9db0ee208789a..96f0906c0a790786675854770d9e97d13fc79a9f 100644 (file)
@@ -124,9 +124,9 @@ public:
     name=getName();
   }
 
-  void xfrText(string &text, bool multi=false)
+  void xfrText(string &text, bool multi=false, bool lenField=true)
   {
-    text=getText(multi);
+    text=getText(multi, lenField);
   }
 
   void xfrBlob(string& blob);
@@ -141,7 +141,7 @@ public:
   void copyRecord(unsigned char* dest, uint16_t len);
 
   DNSName getName();
-  string getText(bool multi);
+  string getText(bool multi, bool lenField);
 
   uint16_t d_pos;
 
index 8dd1dbb99e0542d799211ca93e39fed925b95e38..06dc3b98046b00951e6eab0f8c13bc51da1cf62a 100644 (file)
@@ -146,14 +146,19 @@ void DNSPacketWriter::xfr8BitInt(uint8_t val)
 
 
 /* input:
+ if lenField is true
   "" -> 0
   "blah" -> 4blah
   "blah" "blah" -> output 4blah4blah
   "verylongstringlongerthan256....characters" \xffverylongstring\x23characters (autosplit)
   "blah\"blah" -> 9blah"blah
   "blah\97" -> 5blahb
+
+ if lenField is false
+  "blah" -> blah
+  "blah\"blah" -> blah"blah
   */
-void DNSPacketWriter::xfrText(const string& text, bool)
+void DNSPacketWriter::xfrText(const string& text, bool, bool lenField)
 {
   if(text.empty()) {
     d_record.push_back(0);
@@ -161,7 +166,8 @@ void DNSPacketWriter::xfrText(const string& text, bool)
   }
   vector<string> segments = segmentDNSText(text);
   for(const string& str :  segments) {
-    d_record.push_back(str.length());
+    if(lenField)
+      d_record.push_back(str.length());
     d_record.insert(d_record.end(), str.c_str(), str.c_str() + str.length());
   }
 }
index c5554ef7e47eadfb004730e1449d928753751c79..2936890e414bdbaa03f6d21f9a43ef06b8b10295 100644 (file)
@@ -87,7 +87,7 @@ public:
   void xfr8BitInt(uint8_t val);
 
   void xfrName(const DNSName& label, bool compress=false, bool noDot=false);
-  void xfrText(const string& text, bool multi=false);
+  void xfrText(const string& text, bool multi=false, bool lenField=true);
   void xfrBlob(const string& blob, int len=-1);
   void xfrBlobNoSpaces(const string& blob, int len=-1);
   void xfrHexBlob(const string& blob, bool keepReading=false);
index dd34186de32b06f24dbb4af38df422d788910efb..495d88972e696cfee6fc8fd6d25fcbb8e428f52b 100644 (file)
@@ -333,7 +333,7 @@ void RecordTextWriter::xfrBase32HexBlob(const string& val)
 }
 
 
-void RecordTextReader::xfrText(string& val, bool multi)
+void RecordTextReader::xfrText(string& val, bool multi, bool lenField)
 {
   val.clear();
   val.reserve(d_end - d_pos);
@@ -547,7 +547,7 @@ void RecordTextWriter::xfrHexBlob(const string& val, bool)
   }
 }
 
-void RecordTextWriter::xfrText(const string& val, bool multi)
+void RecordTextWriter::xfrText(const string& val, bool multi, bool lenField)
 {
   if(!d_string.empty())
     d_string.append(1,' ');
index f5af2ea640d2ca600c94a4b6d59abb12049a3ff6..5b33a01b404220b022e2e2e6600675bb38ee31f3 100644 (file)
@@ -53,7 +53,7 @@ public:
   void xfrTime(uint32_t& val);
 
   void xfrName(DNSName& val, bool compress=false, bool noDot=false);
-  void xfrText(string& val, bool multi=false);
+  void xfrText(string& val, bool multi=false, bool lenField=true);
   void xfrHexBlob(string& val, bool keepReading=false);
   void xfrBase32HexBlob(string& val);
 
@@ -84,7 +84,7 @@ public:
 
   void xfrType(const uint16_t& val);
   void xfrName(const DNSName& val, bool compress=false, bool noDot=false);
-  void xfrText(const string& val, bool multi=false);
+  void xfrText(const string& val, bool multi=false, bool lenField=true);
   void xfrBlobNoSpaces(const string& val, int len=-1);
   void xfrBlob(const string& val, int len=-1);
   void xfrHexBlob(const string& val, bool keepReading=false);