From: Mark Andrews Date: Fri, 27 Feb 2015 03:52:26 +0000 (+1100) Subject: 4078. [bug] Hand the case where CMSG_SPACE(sizeof(int)) != X-Git-Tag: v9.11.0a1~961 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=b5edc023a1bb8066d86777dd40fd4555e285de57;p=thirdparty%2Fbind9.git 4078. [bug] Hand the case where CMSG_SPACE(sizeof(int)) != CMSG_SPACE(sizeof(int)). [RT #38621. --- diff --git a/CHANGES b/CHANGES index ddc6d6d41f3..d84592eaf2b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4078. [bug] Hand the case where CMSG_SPACE(sizeof(int)) != + CMSG_SPACE(sizeof(int)). [RT #38621. + 4077. [test] Add static-stub regression test for DS NXDOMAIN return making the static stub disappear. [RT #38564] diff --git a/lib/isc/unix/net.c b/lib/isc/unix/net.c index 12b6e550ff9..2a9d92fa11c 100644 --- a/lib/isc/unix/net.c +++ b/lib/isc/unix/net.c @@ -530,24 +530,30 @@ cmsgsend(int s, int level, int type, struct addrinfo *res) { msg.msg_iov = &iovec; msg.msg_iovlen = 1; msg.msg_control = (void*)&control; - msg.msg_controllen = cmsg_space(sizeof(int)); + msg.msg_controllen = 0; msg.msg_flags = 0; cmsgp = msg.msg_control; - cmsgp->cmsg_level = level; - cmsgp->cmsg_type = type; - switch (cmsgp->cmsg_type) { + switch (type) { #ifdef IP_TOS case IP_TOS: + memset(cmsgp, 0, cmsg_space(sizeof(char))); + cmsgp->cmsg_level = level; + cmsgp->cmsg_type = type; cmsgp->cmsg_len = cmsg_len(sizeof(char)); *(unsigned char*)CMSG_DATA(cmsgp) = dscp; + msg.msg_controllen += cmsg_space(sizeof(char)); break; #endif #ifdef IPV6_TCLASS case IPV6_TCLASS: + memset(cmsgp, 0, cmsg_space(sizeof(dscp))); + cmsgp->cmsg_level = level; + cmsgp->cmsg_type = type; cmsgp->cmsg_len = cmsg_len(sizeof(dscp)); memmove(CMSG_DATA(cmsgp), &dscp, sizeof(dscp)); + msg.msg_controllen += cmsg_space(sizeof(dscp)); break; #endif default: