]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
chore: Switch from string to sockaddr for ipcrypt
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 29 Sep 2025 11:06:56 +0000 (13:06 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 2 Oct 2025 12:07:03 +0000 (14:07 +0200)
pdns/dnsdistdist/dnsdist-ipcrypt2.cc

index 6e2c0a02c89151bf1587c0f224d7b1a931979883..9fcf70d68586866313b34594ba9a173aaaf3c2d2 100644 (file)
@@ -23,6 +23,7 @@
 #include <memory>
 #include <stdexcept>
 #include <string>
+#include <sys/socket.h>
 
 #include "dnsdist-ipcrypt2.hh"
 #include "ipcrypt2.h"
@@ -68,12 +69,23 @@ ComboAddress IPCrypt2::encrypt(const ComboAddress& address) const
 {
   switch (d_method) {
   case IPCryptMethod::pfx: {
-    std::string encryptedIP;
-    encryptedIP.resize(IPCRYPT_MAX_IP_STR_BYTES);
-    auto ret = ipcrypt_pfx_encrypt_ip_str(d_ipcryptCtxPfx.get(), encryptedIP.data(), address.toString().c_str());
-    // XXX: Do we *need* to resize?
-    encryptedIP.resize(ret);
-    return ComboAddress(encryptedIP);
+    uint8_t ip16[16];
+    struct sockaddr_storage sa;
+    if (address.isIPv4()) {
+      std::memcpy(&sa, &address.sin4, sizeof(sockaddr_in));
+    }
+    else {
+      std::memcpy(&sa, &address.sin6, sizeof(sockaddr_in6));
+    }
+    ipcrypt_sockaddr_to_ip16(ip16, reinterpret_cast<sockaddr*>(&sa));
+    ipcrypt_pfx_encrypt_ip16(d_ipcryptCtxPfx.get(), ip16);
+    ipcrypt_ip16_to_sockaddr(&sa, ip16);
+    if (address.isIPv4()) {
+      return ComboAddress(reinterpret_cast<sockaddr_in*>(&sa));
+    }
+    else {
+      return ComboAddress(reinterpret_cast<sockaddr_in6*>(&sa));
+    }
   } break;
   default:
     throw std::runtime_error("Unsupported method");