]> granicus.if.org Git - pdns/commitdiff
Use unsigned char* in getRawLabels() and countLabels()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 26 Apr 2016 15:20:07 +0000 (17:20 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 26 Apr 2016 15:22:56 +0000 (17:22 +0200)
Otherwise we treat values larger than INT8_MAX as negatives
in pointer arithmetic.
Found with American Fuzzy Lop and Address Sanitizer.

pdns/dnsname.cc

index 55849c5a9177885b473c4c65c10805c747915d28..f438a0068ad30e28c045a9b4df7bb94938e5ec6a 100644 (file)
@@ -290,8 +290,9 @@ vector<string> DNSName::getRawLabels() const
   vector<string> ret;
   ret.reserve(countLabels());
   // 3www4ds9a2nl0
-  for(const char* p = d_storage.c_str(); p < d_storage.c_str() + d_storage.size() && *p; p+=*p+1)
-    ret.push_back({p+1, (unsigned int)*p}); // XXX FIXME
+  for(const unsigned char* p = (const unsigned char*) d_storage.c_str(); p < ((const unsigned char*) d_storage.c_str()) + d_storage.size() && *p; p+=*p+1) {
+    ret.push_back({(const char*)p+1, (size_t)*p}); // XXX FIXME
+  }
   return ret;
 }
 
@@ -315,7 +316,7 @@ bool DNSName::isWildcard() const
 unsigned int DNSName::countLabels() const
 {
   unsigned int count=0;
-  for(const char* p = d_storage.c_str(); p < d_storage.c_str() + d_storage.size() && *p; p+=*p+1)
+  for(const unsigned char* p = (const unsigned char*) d_storage.c_str(); p < ((const unsigned char*) d_storage.c_str()) + d_storage.size() && *p; p+=*p+1)
     ++count;
   return count;
 }