]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/pdns_recursor.cc
Merge pull request #6380 from rgacogne/no-vlas
[thirdparty/pdns.git] / pdns / pdns_recursor.cc
index 15486f3e096bc64e8f1efc1b27ea223bccd9013f..14caa80bde5a5dc05f13ae9d2f47e7fd9cb9e64e 100644 (file)
@@ -2567,11 +2567,12 @@ static void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t& var)
 {
   PacketID pid=any_cast<PacketID>(var);
   ssize_t len;
-  char data[g_outgoingEDNSBufsize];
+  std::string packet;
+  packet.resize(g_outgoingEDNSBufsize);
   ComboAddress fromaddr;
   socklen_t addrlen=sizeof(fromaddr);
 
-  len=recvfrom(fd, data, sizeof(data), 0, (sockaddr *)&fromaddr, &addrlen);
+  len=recvfrom(fd, &packet.at(0), packet.size(), 0, (sockaddr *)&fromaddr, &addrlen);
 
   if(len < (ssize_t) sizeof(dnsheader)) {
     if(len < 0)
@@ -2594,8 +2595,9 @@ static void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t& var)
     return;
   }
 
+  packet.resize(len);
   dnsheader dh;
-  memcpy(&dh, data, sizeof(dh));
+  memcpy(&dh, &packet.at(0), sizeof(dh));
 
   PacketID pident;
   pident.remote=fromaddr;
@@ -2614,7 +2616,7 @@ static void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t& var)
   else {
     try {
       if(len > 12)
-        pident.domain=DNSName(data, len, 12, false, &pident.type); // don't copy this from above - we need to do the actual read
+        pident.domain=DNSName(&packet.at(0), len, 12, false, &pident.type); // don't copy this from above - we need to do the actual read
     }
     catch(std::exception& e) {
       g_stats.serverParseError++; // won't be fed to lwres.cc, so we have to increment
@@ -2622,8 +2624,6 @@ static void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t& var)
       return;
     }
   }
-  string packet;
-  packet.assign(data, len);
 
   MT_t::waiters_t::iterator iter=MT->d_waiters.find(pident);
   if(iter != MT->d_waiters.end()) {