]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Introduce xfrBlobNoSpaces
authorAki Tuomi <cmouse@cmouse.fi>
Tue, 27 Jan 2015 09:43:53 +0000 (11:43 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Sat, 31 Jan 2015 14:00:25 +0000 (16:00 +0200)
pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/dnswriter.cc
pdns/dnswriter.hh
pdns/rcpgenerator.cc
pdns/rcpgenerator.hh

index f6ca6b6b623c297c03efb144097c24d6b134da4c..e06eae3409b59b425a2a417d99f23f9772abe14b 100644 (file)
@@ -510,6 +510,10 @@ catch(...)
   throw std::out_of_range("xfrBlob out of range");
 }
 
+void PacketReader::xfrBlobNoSpaces(string& blob, int length) {
+  xfrBlob(blob, length);
+}
+
 void PacketReader::xfrBlob(string& blob, int length)
 {
   if(length) {
index 20436ecbab2c911392bbbb049e175fef2e29a486..5fda67f2bae5ff2ec5d94d2b39b7d1620cb00052 100644 (file)
@@ -128,6 +128,7 @@ public:
   }
 
   void xfrBlob(string& blob);
+  void xfrBlobNoSpaces(string& blob, int len);
   void xfrBlob(string& blob, int length);
   void xfrHexBlob(string& blob, bool keepReading=false);
 
index 336e8a633b316ce8b9ed28d624a6a6aeeedab5a1..e38055ba5db01eda79097fb64d6958b9cdd33222 100644 (file)
@@ -285,6 +285,11 @@ void DNSPacketWriter::xfrBlob(const string& blob, int  )
   d_record.insert(d_record.end(), ptr, ptr+blob.size());
 }
 
+void DNSPacketWriter::xfrBlobNoSpaces(const string& blob, int  )
+{
+  xfrBlob(blob);
+}
+
 void DNSPacketWriter::xfrHexBlob(const string& blob, bool keepReading)
 {
   xfrBlob(blob);
index fb39c124c881ce273df883c4fd8e3c88f103b8b0..70bc50e8e848af917342cca4c4489b7a41af3715 100644 (file)
@@ -89,6 +89,7 @@ public:
   void xfrLabel(const string& label, bool compress=false);
   void xfrText(const string& text, bool multi=false);
   void xfrBlob(const string& blob, int len=-1);
+  void xfrBlobNoSpaces(const string& blob, int len=-1);
   void xfrHexBlob(const string& blob, bool keepReading=false);
 
   uint16_t d_pos;
index b088b100e9f9ecee37608b182169f5aa10effe89..a3b4354bc70efc3d768a03db5ef41f6cc4daa5e0 100644 (file)
@@ -208,10 +208,10 @@ void RecordTextReader::xfrLabel(string& val, bool)
   }
 }
 
-static bool isbase64(char c)
+static bool isbase64(char c, bool acceptspace)
 {
   if(dns_isspace(c))
-    return true;
+    return acceptspace;
   if(c >= '0' && c <= '9')
     return true;
   if(c >= 'a' && c <= 'z') 
@@ -223,12 +223,29 @@ static bool isbase64(char c)
   return false;
 }
 
+void RecordTextReader::xfrBlobNoSpaces(string& val, int len) {
+  skipSpaces();
+  int pos=(int)d_pos;
+  const char* strptr=d_string.c_str();
+  while(d_pos < d_end && isbase64(strptr[d_pos], false)) 
+    d_pos++;
+
+  string tmp;
+  tmp.assign(d_string.c_str()+pos, d_string.c_str() + d_pos);
+  boost::erase_all(tmp," ");
+  val.clear();
+  B64Decode(tmp, val);
+  
+  if (len>-1 && val.size() != static_cast<size_t>(len))
+    throw RecordTextException("Record length "+lexical_cast<string>(val.size()) + " does not match expected length '"+lexical_cast<string>(len));
+}
+
 void RecordTextReader::xfrBlob(string& val, int)
 {
   skipSpaces();
   int pos=(int)d_pos;
   const char* strptr=d_string.c_str();
-  while(d_pos < d_end && isbase64(strptr[d_pos]))
+  while(d_pos < d_end && isbase64(strptr[d_pos], true))
     d_pos++;
   
   string tmp;
@@ -485,6 +502,11 @@ void RecordTextWriter::xfrLabel(const string& val, bool)
   d_string+=val;
 }
 
+void RecordTextWriter::xfrBlobNoSpaces(const string& val, int size)
+{
+  xfrBlob(val, size);
+}
+
 void RecordTextWriter::xfrBlob(const string& val, int)
 {
   if(!d_string.empty())
index 040ce7f51da4b573f310e189bba51b369fd6a520..fb9aac9415413ee25a2ac3384b74b6a949de9a12 100644 (file)
@@ -56,6 +56,7 @@ public:
   void xfrHexBlob(string& val, bool keepReading=false);
   void xfrBase32HexBlob(string& val);
 
+  void xfrBlobNoSpaces(string& val, int len=-1);
   void xfrBlob(string& val, int len=-1);
 
   bool eof();
@@ -83,6 +84,7 @@ public:
   void xfrType(const uint16_t& val);
   void xfrLabel(const string& val, bool compress=false);
   void xfrText(const string& val, bool multi=false);
+  void xfrBlobNoSpaces(const string& val, int len=-1);
   void xfrBlob(const string& val, int len=-1);
   void xfrHexBlob(const string& val, bool keepReading=false);
   bool eof() { return true; };