]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Ensures that msg_controllen includes last padding.
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 26 Jun 2014 11:30:27 +0000 (13:30 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 26 Jun 2014 11:30:27 +0000 (13:30 +0200)
Although RFC 3542 allows both cases, Theo de Raadt thinks
he knows better, and msg_controllen without last padding
fails on OpenBSD.

Thanks to Job Snijders for the bugreport.

sysdep/bsd/sysio.h
sysdep/linux/sysio.h
sysdep/unix/io.c

index fa3969bdfd54215b71cfd45af53d07bc59f4a0e0..df5e02367697998d003ed6ebda2cb694300ae277 100644 (file)
@@ -141,6 +141,7 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
 #ifdef IP_SENDSRCADDR
   struct cmsghdr *cm;
   struct in_addr *sa;
+  int controllen = 0;
 
   msg->msg_control = cbuf;
   msg->msg_controllen = cbuflen;
@@ -149,11 +150,12 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
   cm->cmsg_level = IPPROTO_IP;
   cm->cmsg_type = IP_SENDSRCADDR;
   cm->cmsg_len = CMSG_LEN(sizeof(*sa));
+  controllen += CMSG_SPACE(sizeof(*sa));
 
   sa = (struct in_addr *) CMSG_DATA(cm);
   *sa = ipa_to_in4(s->saddr);
 
-  msg->msg_controllen = cm->cmsg_len;
+  msg->msg_controllen = controllen;
 #endif
 }
 
index 5fd75c900ec8408fd8cc3591edee481d82980f6a..c1561cbf17c212090aecc3e6b46968b14cc7ebcb 100644 (file)
@@ -154,6 +154,7 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
 {
   struct cmsghdr *cm;
   struct in_pktinfo *pi;
+  int controllen = 0;
 
   msg->msg_control = cbuf;
   msg->msg_controllen = cbuflen;
@@ -162,13 +163,14 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
   cm->cmsg_level = SOL_IP;
   cm->cmsg_type = IP_PKTINFO;
   cm->cmsg_len = CMSG_LEN(sizeof(*pi));
+  controllen += CMSG_SPACE(sizeof(*pi));
 
   pi = (struct in_pktinfo *) CMSG_DATA(cm);
   pi->ipi_ifindex = s->iface ? s->iface->index : 0;
   pi->ipi_spec_dst = ipa_to_in4(s->saddr);
   pi->ipi_addr = ipa_to_in4(IPA_NONE);
 
-  msg->msg_controllen = cm->cmsg_len;
+  msg->msg_controllen = controllen;
 }
 
 
index 5a0c07e525a8120abc28c2b4e9846ddd8f584f30..a5477695f69f08f91e1e01d2c24859983991b3a0 100644 (file)
@@ -705,6 +705,7 @@ sk_prepare_cmsgs6(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
 {
   struct cmsghdr *cm;
   struct in6_pktinfo *pi;
+  int controllen = 0;
 
   msg->msg_control = cbuf;
   msg->msg_controllen = cbuflen;
@@ -713,12 +714,13 @@ sk_prepare_cmsgs6(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen)
   cm->cmsg_level = SOL_IPV6;
   cm->cmsg_type = IPV6_PKTINFO;
   cm->cmsg_len = CMSG_LEN(sizeof(*pi));
+  controllen += CMSG_SPACE(sizeof(*pi));
 
   pi = (struct in6_pktinfo *) CMSG_DATA(cm);
   pi->ipi6_ifindex = s->iface ? s->iface->index : 0;
   pi->ipi6_addr = ipa_to_in6(s->saddr);
 
-  msg->msg_controllen = cm->cmsg_len;
+  msg->msg_controllen = controllen;
 }