]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Only access cmsg->cmsg_len when cmsg is initialized. 1405/head
authorFlorian Obser <florian@narrans.de>
Mon, 12 May 2014 09:10:42 +0000 (11:10 +0200)
committerFlorian Obser <florian@narrans.de>
Mon, 12 May 2014 09:10:42 +0000 (11:10 +0200)
When neither IP_PKTINFO nor IP_SENDSRCADDR are defined cmsg is not
initialized and leads to random crashes. While there initialize cmsg
to NULL which would have made it easier to find this bug.

pdns/misc.cc

index db9ea9675165bbf3a231cec21498c340e05664ad..dbbc7f9d31133f4407da2d25e5fa689ff3ee13ef 100644 (file)
@@ -777,7 +777,7 @@ Regex::Regex(const string &expr)
 
 void addCMsgSrcAddr(struct msghdr* msgh, void* cmsgbuf, ComboAddress* source)
 {
-  struct cmsghdr *cmsg;
+  struct cmsghdr *cmsg = NULL;
 
   if(source->sin4.sin_family == AF_INET6) {
     struct in6_pktinfo *pkt;
@@ -810,6 +810,7 @@ void addCMsgSrcAddr(struct msghdr* msgh, void* cmsgbuf, ComboAddress* source)
     pkt = (struct in_pktinfo *) CMSG_DATA(cmsg);
     memset(pkt, 0, sizeof(*pkt));
     pkt->ipi_spec_dst = source->sin4.sin_addr;
+    msgh->msg_controllen = cmsg->cmsg_len;
 #endif
 #ifdef IP_SENDSRCADDR
     struct in_addr *in;
@@ -824,8 +825,8 @@ void addCMsgSrcAddr(struct msghdr* msgh, void* cmsgbuf, ComboAddress* source)
 
     in = (struct in_addr *) CMSG_DATA(cmsg);
     *in = source->sin4.sin_addr;
-#endif
     msgh->msg_controllen = cmsg->cmsg_len;
+#endif
   }
 }