]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dns.cc: use pdns::views::UnsignedCharView 14467/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 19 Jun 2024 11:10:15 +0000 (13:10 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 12 Jul 2024 10:02:52 +0000 (12:02 +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/dnsdistdist/Makefile.am
pdns/dnsdistdist/views.hh [new symlink]
pdns/views.hh [new file with mode: 0644]

index d9fb5096f88c213ff88e369c131bb5da12674fe9..7824f40300a1eb92f5c4b5eb57533511ea4986a6 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>
@@ -100,27 +101,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 f81f8bfb469f44ec7c7a6a2e20bed89128d58435..19e682ce0439f6eb8a47959524a6ab4df19499dd 100644 (file)
@@ -238,6 +238,7 @@ dnsdist_SOURCES = \
        tcpiohandler.cc tcpiohandler.hh \
        threadname.hh threadname.cc \
        uuid-utils.hh uuid-utils.cc \
+       views.hh \
        xpf.cc xpf.hh
 
 testrunner_SOURCES = \
@@ -337,6 +338,7 @@ testrunner_SOURCES = \
        testrunner.cc \
        threadname.hh threadname.cc \
        uuid-utils.hh uuid-utils.cc \
+       views.hh \
        xpf.cc xpf.hh
 
 dnsdist_LDFLAGS = \
diff --git a/pdns/dnsdistdist/views.hh b/pdns/dnsdistdist/views.hh
new file mode 120000 (symlink)
index 0000000..2213b7d
--- /dev/null
@@ -0,0 +1 @@
+../views.hh
\ No newline at end of file
diff --git a/pdns/views.hh b/pdns/views.hh
new file mode 100644 (file)
index 0000000..b6be930
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * This file is part of PowerDNS or dnsdist.
+ * Copyright -- PowerDNS.COM B.V. and its contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * In addition, for the avoidance of any doubt, permission is granted to
+ * link this program with OpenSSL and to (re)distribute the binaries
+ * produced as the result of such linking.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#pragma once
+
+#include <string_view>
+
+namespace pdns::views
+{
+
+class UnsignedCharView
+{
+public:
+  UnsignedCharView(const char* data_, size_t size_) :
+    view(data_, size_)
+  {
+  }
+  // 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_)
+  {
+  }
+  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));
+  }
+
+  [[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;
+};
+
+}