summaryrefslogtreecommitdiffstats
path: root/net/tools
diff options
context:
space:
mode:
authorglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-26 16:50:59 +0000
committerglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-26 16:50:59 +0000
commit01eeb9f46d0c0759c1e179475e5dd459181a186e (patch)
treea08d0a6bd2915bc9aec4f982a69a1c778ac7f4ef /net/tools
parent0806d93c1761f5237cc0567b6c6ddd296d206f47 (diff)
downloadchromium_src-01eeb9f46d0c0759c1e179475e5dd459181a186e.zip
chromium_src-01eeb9f46d0c0759c1e179475e5dd459181a186e.tar.gz
chromium_src-01eeb9f46d0c0759c1e179475e5dd459181a186e.tar.bz2
Fix the message lengths passed to sendmsg() in QuicSocketUtils::WritePacket
BUG=263753 TEST=Valgrind doesn't bark at QuicSocketUtils::WritePacket R=rtenneti@chromium.org Review URL: https://codereview.chromium.org/20290002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@213937 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/tools')
-rw-r--r--net/tools/quic/quic_socket_utils.cc22
1 files changed, 14 insertions, 8 deletions
diff --git a/net/tools/quic/quic_socket_utils.cc b/net/tools/quic/quic_socket_utils.cc
index e46b849..ab66102 100644
--- a/net/tools/quic/quic_socket_utils.cc
+++ b/net/tools/quic/quic_socket_utils.cc
@@ -141,20 +141,24 @@ int QuicSocketUtils::WritePacket(int fd, const char* buffer, size_t buf_len,
msghdr hdr;
hdr.msg_name = &raw_address;
- hdr.msg_namelen = sizeof(raw_address);
+ hdr.msg_namelen = address_len;
hdr.msg_iov = &iov;
hdr.msg_iovlen = 1;
hdr.msg_flags = 0;
- const int kSpaceForIp = CMSG_SPACE(sizeof(in6_pktinfo));
+ const int kSpaceForIpv4 = CMSG_SPACE(sizeof(in_pktinfo));
+ const int kSpaceForIpv6 = CMSG_SPACE(sizeof(in6_pktinfo));
+ // kSpaceForIp should be big enough to hold both IPv4 and IPv6 packet info.
+ const int kSpaceForIp =
+ (kSpaceForIpv4 < kSpaceForIpv6) ? kSpaceForIpv6 : kSpaceForIpv4;
char cbuf[kSpaceForIp];
if (self_address.empty()) {
hdr.msg_control = 0;
hdr.msg_controllen = 0;
} else if (GetAddressFamily(self_address) == ADDRESS_FAMILY_IPV4) {
- cmsghdr *cmsg = reinterpret_cast<cmsghdr*>(cbuf);
- hdr.msg_control = cmsg;
- hdr.msg_controllen = CMSG_SPACE(sizeof(in_pktinfo));
+ hdr.msg_control = cbuf;
+ hdr.msg_controllen = kSpaceForIp;
+ cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
cmsg->cmsg_len = CMSG_LEN(sizeof(in_pktinfo));
cmsg->cmsg_level = IPPROTO_IP;
@@ -163,10 +167,11 @@ int QuicSocketUtils::WritePacket(int fd, const char* buffer, size_t buf_len,
memset(pktinfo, 0, sizeof(in_pktinfo));
pktinfo->ipi_ifindex = 0;
memcpy(&pktinfo->ipi_spec_dst, &self_address[0], self_address.size());
+ hdr.msg_controllen = cmsg->cmsg_len;
} else {
- cmsghdr *cmsg = reinterpret_cast<cmsghdr*>(cbuf);
- hdr.msg_control = cmsg;
- hdr.msg_controllen = CMSG_SPACE(sizeof(in6_pktinfo));
+ hdr.msg_control = cbuf;
+ hdr.msg_controllen = kSpaceForIp;
+ cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
cmsg->cmsg_len = CMSG_LEN(sizeof(in6_pktinfo));
cmsg->cmsg_level = IPPROTO_IPV6;
@@ -174,6 +179,7 @@ int QuicSocketUtils::WritePacket(int fd, const char* buffer, size_t buf_len,
in6_pktinfo* pktinfo = reinterpret_cast<in6_pktinfo*>(CMSG_DATA(cmsg));
memset(pktinfo, 0, sizeof(in6_pktinfo));
memcpy(&pktinfo->ipi6_addr, &self_address[0], self_address.size());
+ hdr.msg_controllen = cmsg->cmsg_len;
}
int rc = sendmsg(fd, &hdr, 0);