]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Wrap the pipe descriptors earlier, do not leak on send errors
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 Mar 2022 09:32:42 +0000 (10:32 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 13 Jun 2023 07:59:35 +0000 (09:59 +0200)
pdns/dnsdistdist/channel.cc
pdns/dnsdistdist/channel.hh

index 75cca8a706426dcc24b77a61e19434ad134ffd45..dd25c6d34eeef1a21502659733cb23fa134292a6 100644 (file)
@@ -82,27 +82,23 @@ namespace channel
       throw std::runtime_error("Error creating notification channel pipe: " + stringerror());
     }
 
-    if (nonBlocking && !setNonBlocking(fds[0])) {
+    FDWrapper sender(fds[1]);
+    FDWrapper receiver(fds[0]);
+
+    if (nonBlocking && !setNonBlocking(receiver.getHandle())) {
       int err = errno;
-      close(fds[0]);
-      close(fds[1]);
       throw std::runtime_error("Error making notification channel pipe non-blocking: " + stringerror(err));
     }
 
-    if (nonBlocking && !setNonBlocking(fds[1])) {
+    if (nonBlocking && !setNonBlocking(sender.getHandle())) {
       int err = errno;
-      close(fds[0]);
-      close(fds[1]);
       throw std::runtime_error("Error making notification channel pipe non-blocking: " + stringerror(err));
     }
 
-    if (pipeBufferSize > 0 && getPipeBufferSize(fds[0]) < pipeBufferSize) {
-      setPipeBufferSize(fds[0], pipeBufferSize);
+    if (pipeBufferSize > 0 && getPipeBufferSize(receiver.getHandle()) < pipeBufferSize) {
+      setPipeBufferSize(receiver.getHandle(), pipeBufferSize);
     }
 
-    FDWrapper sender(fds[1]);
-    FDWrapper receiver(fds[0]);
-
     return std::pair(Notifier(std::move(sender)), Waiter(std::move(receiver)));
   }
 }
index 55ee5f956d7e957295d3a22c775d0b7b85ad5010..5698fb7ba3e7cbd4d21986646633f15e199af028 100644 (file)
@@ -191,13 +191,13 @@ namespace channel
     ssize_t sent = write(d_fd.getHandle(), &ptr, sizeof(ptr));
 
     if (sent != sizeof(ptr)) {
+      delete ptr;
       if (errno == EAGAIN || errno == EWOULDBLOCK) {
         return false;
       }
       else {
         throw std::runtime_error("Unable to write to channel:" + stringerror());
       }
-      delete ptr;
     }
 
     return true;
@@ -234,27 +234,23 @@ namespace channel
       throw std::runtime_error("Error creating channel pipe: " + stringerror());
     }
 
-    if (nonBlocking && !setNonBlocking(fds[0])) {
+    FDWrapper sender(fds[1]);
+    FDWrapper receiver(fds[0]);
+
+    if (nonBlocking && !setNonBlocking(receiver.getHandle())) {
       int err = errno;
-      close(fds[0]);
-      close(fds[1]);
       throw std::runtime_error("Error making channel pipe non-blocking: " + stringerror(err));
     }
 
-    if (nonBlocking && !setNonBlocking(fds[1])) {
+    if (nonBlocking && !setNonBlocking(sender.getHandle())) {
       int err = errno;
-      close(fds[0]);
-      close(fds[1]);
       throw std::runtime_error("Error making channel pipe non-blocking: " + stringerror(err));
     }
 
-    if (pipeBufferSize > 0 && getPipeBufferSize(fds[0]) < pipeBufferSize) {
-      setPipeBufferSize(fds[0], pipeBufferSize);
+    if (pipeBufferSize > 0 && getPipeBufferSize(receiver.getHandle()) < pipeBufferSize) {
+      setPipeBufferSize(receiver.getHandle(), pipeBufferSize);
     }
 
-    FDWrapper sender(fds[1]);
-    FDWrapper receiver(fds[0]);
-
     return std::pair(Sender<T>(std::move(sender)), Receiver<T>(std::move(receiver)));
   }
 }