]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dns.cc: use pdns::views::UnsignedCharView 14359/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 19 Jun 2024 11:10:15 +0000 (13:10 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 19 Jun 2024 11:10:15 +0000 (13:10 +0200)
Includes minor cleanup and additions to make UnsignedCharView usable for this use case.
Supersedes #14356
Fixes
/usr/include/c++/v1/__fwd/string_view.h:22:41: warning: 'char_traits<unsigned char>' is deprecated: char_traits<T> for T not equal to char, wchar_t, char8_t, char16_t or char32_t is non-standard and is provided for a temporary period. It will be removed in LLVM 19, so please migrate off of it. [-Wdeprecated-declarations]

pdns/dns.cc
pdns/views.hh

index 99bbd72aa65e8749e66ee8237914427ab80ba681..5e7e45e1f604037a34084805734099c8a40ea28e 100644 (file)
@@ -24,6 +24,7 @@
 #endif
 #include "dns.hh"
 #include "misc.hh"
+#include "views.hh"
 #include <stdexcept>
 #include <iostream>
 #include <boost/algorithm/string.hpp>
@@ -102,27 +103,27 @@ std::string Opcode::to_s(uint8_t opcode) {
 }
 
 // goal is to hash based purely on the question name, and turn error into 'default'
-uint32_t hashQuestion(const uint8_t* packet, uint16_t packet_len, uint32_t init, bool& ok)
+uint32_t hashQuestion(const uint8_t* packet, uint16_t packet_len, uint32_t init, bool& wasOK)
 {
   if (packet_len < sizeof(dnsheader)) {
-    ok = false;
+    wasOK = false;
     return init;
   }
-  // C++ 17 does not have std::u8string_view
-  std::basic_string_view<uint8_t> name(packet + sizeof(dnsheader), packet_len - sizeof(dnsheader));
-  std::basic_string_view<uint8_t>::size_type len = 0;
+  // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+  pdns::views::UnsignedCharView name(packet + sizeof(dnsheader), packet_len - sizeof(dnsheader));
+  pdns::views::UnsignedCharView::size_type len = 0;
 
   while (len < name.length()) {
     uint8_t labellen = name[len++];
     if (labellen == 0) {
-      ok = true;
+      wasOK = true;
       // len is name.length() at max as it was < before the increment
       return burtleCI(name.data(), len, init);
     }
     len += labellen;
   }
   // We've encountered a label that is too long
-  ok = false;
+  wasOK = false;
   return init;
 }
 
index c3c8c898b3fea6787469a06701f72671eaba6ec2..b6be93019c1c119e87096156d8c740b0acf5c963 100644 (file)
@@ -33,21 +33,39 @@ public:
     view(data_, size_)
   {
   }
-  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast): No unsigned char view in C++17
+  // NOLINTBEGIN(cppcoreguidelines-pro-type-reinterpret-cast): No unsigned char view in C++17
   UnsignedCharView(const unsigned char* data_, size_t size_) :
     view(reinterpret_cast<const char*>(data_), size_)
   {
   }
-  const unsigned char& at(std::string_view::size_type pos) const
+  using size_type = std::string_view::size_type;
+
+  [[nodiscard]] const unsigned char& at(size_type pos) const
   {
     return reinterpret_cast<const unsigned char&>(view.at(pos));
   }
 
-  size_t size() const
+  [[nodiscard]] const unsigned char& operator[](size_type pos) const
+  {
+    return reinterpret_cast<const unsigned char&>(view[pos]);
+  }
+
+  [[nodiscard]] const unsigned char* data() const
+  {
+    return reinterpret_cast<const unsigned char*>(view.data());
+  }
+  // NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast): No unsigned char view in C++17
+
+  [[nodiscard]] size_t size() const
   {
     return view.size();
   }
 
+  [[nodiscard]] size_t length() const
+  {
+    return view.length();
+  }
+
 private:
   std::string_view view;
 };