]> granicus.if.org Git - pdns/commitdiff
make sure we never call sendmsg with msg_control!=NULL && msg_controllen>0. Fixes...
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Fri, 13 Feb 2015 08:29:00 +0000 (09:29 +0100)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Fri, 13 Feb 2015 08:29:00 +0000 (09:29 +0100)
pdns/iputils.cc
pdns/nameserver.cc
pdns/pdns_recursor.cc

index 83c48d9ca33f9701044fb3344a4bb3a1b8f51579..5ea22f9790b65d25cdeb8f763dd42ab4572ba616 100644 (file)
@@ -115,6 +115,7 @@ bool IsAnyAddress(const ComboAddress& addr)
   return false;
 }
 
+// FIXME: this function is unused, and using it could reduce some code duplication
 int sendfromto(int sock, const char* data, int len, int flags, const ComboAddress& from, const ComboAddress& to)
 {
   struct msghdr msgh;
@@ -133,11 +134,15 @@ int sendfromto(int sock, const char* data, int len, int flags, const ComboAddres
   if(from.sin4.sin_family) {
     addCMsgSrcAddr(&msgh, cbuf, &from);
   }
+  else {
+    msgh.msg_control=NULL;
+  }
   return sendmsg(sock, &msgh, flags);
 }
 
 // be careful: when using this for receive purposes, make sure addr->sin4.sin_family is set appropriately so getSocklen works!
 // be careful: when using this function for *send* purposes, be sure to set cbufsize to 0!
+// be careful: if you don't call addCMsgSrcAddr after fillMSGHdr, make sure to set msg_control to NULL
 void fillMSGHdr(struct msghdr* msgh, struct iovec* iov, char* cbuf, size_t cbufsize, char* data, size_t datalen, ComboAddress* addr)
 {
   iov->iov_base = data;
index 99be86b996f7f15513aa9db2a8e9b29994fd47d4..27823af82ea0ce46d6dee6699ef59791370262b7 100644 (file)
@@ -300,6 +300,9 @@ void UDPNameserver::send(DNSPacket *p)
   if(p->d_anyLocal) {
     addCMsgSrcAddr(&msgh, cbuf, p->d_anyLocal.get_ptr());
   }
+  else {
+    msgh.msg_control=NULL;
+  }
   DLOG(L<<Logger::Notice<<"Sending a packet to "<< p->getRemote() <<" ("<< buffer.length()<<" octets)"<<endl);
   if(buffer.length() > p->getMaxReplyLen()) {
     L<<Logger::Error<<"Weird, trying to send a message that needs truncation, "<< buffer.length()<<" > "<<p->getMaxReplyLen()<<endl;
index fdee0f115e54a3e28954b6c42d7b83f35d978d20..23fca87bed28ce99777ea8b5a2e8d8217fc15039 100644 (file)
@@ -688,6 +688,8 @@ void startDoResolve(void *p)
       fillMSGHdr(&msgh, &iov, cbuf, 0, (char*)&*packet.begin(), packet.size(), &dc->d_remote);
       if(dc->d_local.sin4.sin_family)
        addCMsgSrcAddr(&msgh, cbuf, &dc->d_local);
+      else
+        msgh.msg_control=NULL;
       sendmsg(dc->d_socket, &msgh, 0);
       if(!SyncRes::s_nopacketcache && !variableAnswer ) {
         t_packetCache->insertResponsePacket(string((const char*)&*packet.begin(), packet.size()),
@@ -961,6 +963,9 @@ string* doProcessUDPQuestion(const std::string& question, const ComboAddress& fr
       if(destaddr.sin4.sin_family) {
        addCMsgSrcAddr(&msgh, cbuf, &destaddr);
       }
+      else {
+        msgh.msg_control=NULL;
+      }
       sendmsg(fd, &msgh, 0);
 
       if(response.length() >= sizeof(struct dnsheader)) {