]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Delint dnsdist-lua-network.cc 13584/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 7 Dec 2023 15:54:37 +0000 (16:54 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 8 Dec 2023 07:44:58 +0000 (08:44 +0100)
pdns/dnsdistdist/dnsdist-lua-network.cc
pdns/dnsdistdist/dnsdist-lua-network.hh

index 5a2e3c2f0019b5eb732308d5186be06e9e2bd726..56a58cd5cf8bb29cac08b1efaf96da9b2938441b 100644 (file)
@@ -50,24 +50,26 @@ void NetworkListener::readCB(int desc, FDMultiplexer::funcparam_t& param)
 
 #ifdef MSG_TRUNC
   /* first we peek to avoid allocating a very large buffer. "MSG_TRUNC [...] return the real length of the datagram, even when it was longer than the passed buffer" */
-  auto peeked = recvfrom(desc, nullptr, 0, MSG_PEEK | MSG_TRUNC, nullptr, 0);
+  auto peeked = recvfrom(desc, nullptr, 0, MSG_PEEK | MSG_TRUNC, nullptr, nullptr);
   if (peeked > 0) {
     packet.resize(static_cast<size_t>(peeked));
   }
 #endif
-  if (packet.size() == 0) {
+  if (packet.empty()) {
     packet.resize(65535);
   }
 
-  struct sockaddr_un from;
+  sockaddr_un from{};
   memset(&from, 0, sizeof(from));
 
   socklen_t fromLen = sizeof(from);
+  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
   auto got = recvfrom(desc, &packet.at(0), packet.size(), 0, reinterpret_cast<sockaddr*>(&from), &fromLen);
   if (got > 0) {
     packet.resize(static_cast<size_t>(got));
     std::string fromAddr;
     if (fromLen <= sizeof(from)) {
+      // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
       fromAddr = std::string(from.sun_path, strlen(from.sun_path));
     }
     try {
@@ -82,13 +84,13 @@ void NetworkListener::readCB(int desc, FDMultiplexer::funcparam_t& param)
   }
 }
 
-bool NetworkListener::addUnixListeningEndpoint(const std::string& path, NetworkListener::EndpointID id, NetworkListener::NetworkDatagramCB cb)
+bool NetworkListener::addUnixListeningEndpoint(const std::string& path, NetworkListener::EndpointID endpointID, NetworkListener::NetworkDatagramCB callback)
 {
-  if (d_data->d_running == true) {
+  if (d_data->d_running) {
     throw std::runtime_error("NetworkListener should not be altered at runtime");
   }
 
-  struct sockaddr_un sun;
+  sockaddr_un sun{};
   if (makeUNsockaddr(path, &sun) != 0) {
     throw std::runtime_error("Invalid Unix socket path '" + path + "'");
   }
@@ -111,6 +113,7 @@ bool NetworkListener::addUnixListeningEndpoint(const std::string& path, NetworkL
     sunLength = sizeof(sa_family_t) + path.size();
   }
 
+  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
   if (bind(sock.getHandle(), reinterpret_cast<const struct sockaddr*>(&sun), sunLength) != 0) {
     std::string sanitizedPath(path);
     if (abstractPath) {
@@ -122,8 +125,8 @@ bool NetworkListener::addUnixListeningEndpoint(const std::string& path, NetworkL
   sock.setNonBlocking();
 
   auto cbData = std::make_shared<CBData>();
-  cbData->d_endpoint = id;
-  cbData->d_cb = std::move(cb);
+  cbData->d_endpoint = endpointID;
+  cbData->d_cb = std::move(callback);
   d_data->d_mplexer->addReadFD(sock.getHandle(), readCB, cbData);
 
   d_data->d_sockets.insert({path, std::move(sock)});
@@ -141,7 +144,7 @@ void NetworkListener::runOnce(ListenerData& data, timeval& now, uint32_t timeout
     throw runtime_error("NetworkListener started with no sockets");
   }
 
-  data.d_mplexer->run(&now, timeout);
+  data.d_mplexer->run(&now, static_cast<int>(timeout));
 }
 
 void NetworkListener::runOnce(timeval& now, uint32_t timeout)
@@ -153,6 +156,7 @@ void NetworkListener::mainThread(std::shared_ptr<ListenerData>& dataArg)
 {
   /* take our own copy of the shared_ptr so it's still alive if the NetworkListener object
      gets destroyed while we are still running */
+  // NOLINTNEXTLINE(performance-unnecessary-copy-initialization): we really need a copy here, or we end up with use-after-free as explained above
   auto data = dataArg;
   setThreadName("dnsdist/lua-net");
   timeval now{};
@@ -173,7 +177,7 @@ void NetworkListener::start()
 NetworkEndpoint::NetworkEndpoint(const std::string& path) :
   d_socket(AF_UNIX, SOCK_DGRAM, 0)
 {
-  struct sockaddr_un sun;
+  sockaddr_un sun{};
   if (makeUNsockaddr(path, &sun) != 0) {
     throw std::runtime_error("Invalid Unix socket path '" + path + "'");
   }
@@ -185,6 +189,7 @@ NetworkEndpoint::NetworkEndpoint(const std::string& path) :
     /* abstract paths can contain null bytes so we need to set the actual size */
     sunLength = sizeof(sa_family_t) + path.size();
   }
+  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
   if (connect(d_socket.getHandle(), reinterpret_cast<const struct sockaddr*>(&sun), sunLength) != 0) {
     std::string sanitizedPath(path);
     if (abstractPath) {
index 3d12f63acdf27bfaa232394b76e3cbf065bedc4e..3cd2f08442713f280da31cf24c35c071226a9ae7 100644 (file)
@@ -42,7 +42,7 @@ public:
 
   using EndpointID = uint16_t;
   using NetworkDatagramCB = std::function<void(EndpointID endpoint, std::string&& dgram, const std::string& from)>;
-  bool addUnixListeningEndpoint(const std::string& path, EndpointID id, NetworkDatagramCB cb);
+  bool addUnixListeningEndpoint(const std::string& path, EndpointID endpointID, NetworkDatagramCB callback);
   void start();
   void runOnce(timeval& now, uint32_t timeout);