]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4078. [bug] Hand the case where CMSG_SPACE(sizeof(int)) !=
authorMark Andrews <marka@isc.org>
Fri, 27 Feb 2015 03:52:26 +0000 (14:52 +1100)
committerMark Andrews <marka@isc.org>
Fri, 27 Feb 2015 03:52:26 +0000 (14:52 +1100)
                        CMSG_SPACE(sizeof(int)). [RT #38621.

CHANGES
lib/isc/unix/net.c

diff --git a/CHANGES b/CHANGES
index ddc6d6d41f378e5834c2a2e965947c37d7fbb8e1..d84592eaf2b2f64b34ffb16a1516b1c5235c22c8 100644 (file)
--- 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]
 
index 12b6e550ff9f274521023494816de0f4274d3ce2..2a9d92fa11ca5a0127fc2623e3e05249642a5964 100644 (file)
@@ -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: