]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fix interface automatic to work for ipv6 on openbsd.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Mar 2010 08:37:50 +0000 (08:37 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Mar 2010 08:37:50 +0000 (08:37 +0000)
git-svn-id: file:///svn/unbound/trunk@2039 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
util/netevent.c

index 7674ca206173d82e75bfcffb9fb88db63cfa568e..a8722124f8718d8feb7a4ed0d27caeaa10a0e691 100644 (file)
@@ -1,3 +1,7 @@
+16 March 2010: Wouter
+       - Fix interface-automatic for OpenBSD: msg.controllen was too small,
+         also assertions on ancillary data buffer.
+
 15 March 2010: Wouter
        - unit test for util/regional.c.
 
index eda2892034fa25435d38f41d21776d7bbb19c2f8..fcc83b62a643fb32a3a85a10f05bb6a11ac442ed 100644 (file)
@@ -381,12 +381,16 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
        cmsg = CMSG_FIRSTHDR(&msg);
        if(r->srctype == 4) {
 #ifdef IP_RECVDSTADDR
+               msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
+               log_assert(msg.msg_controllen <= sizeof(control));
                cmsg->cmsg_level = IPPROTO_IP;
                cmsg->cmsg_type = IP_RECVDSTADDR;
                memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
                        sizeof(struct in_addr));
                cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
 #elif defined(IP_PKTINFO)
+               msg.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
+               log_assert(msg.msg_controllen <= sizeof(control));
                cmsg->cmsg_level = IPPROTO_IP;
                cmsg->cmsg_type = IP_PKTINFO;
                memmove(CMSG_DATA(cmsg), &r->pktinfo.v4info,
@@ -394,6 +398,8 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
                cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
 #endif
        } else if(r->srctype == 6) {
+               msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
+               log_assert(msg.msg_controllen <= sizeof(control));
                cmsg->cmsg_level = IPPROTO_IPV6;
                cmsg->cmsg_type = IPV6_PKTINFO;
                memmove(CMSG_DATA(cmsg), &r->pktinfo.v6info,
@@ -401,14 +407,14 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
                cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
        } else {
                /* try to pass all 0 to use default route */
+               msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
+               log_assert(msg.msg_controllen <= sizeof(control));
                cmsg->cmsg_level = IPPROTO_IPV6;
                cmsg->cmsg_type = IPV6_PKTINFO;
                memset(CMSG_DATA(cmsg), 0, sizeof(struct in6_pktinfo));
                cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
        }
-       msg.msg_controllen = cmsg->cmsg_len;
 #endif /* S_SPLINT_S */
-
        if(verbosity >= VERB_ALGO)
                p_ancil("send_udp over interface", r);
        sent = sendmsg(c->fd, &msg, 0);