diff options
author | Colin Cross <ccross@android.com> | 2021-08-16 12:56:46 -0700 |
---|---|---|
committer | Openscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2021-08-20 23:52:58 +0000 |
commit | 282792c45b6d444a27e7af6bc80cab1f88ee0a15 (patch) | |
tree | e93e753cd6e26b905f69fc53079b6f664f204167 | |
parent | c1ba479f10d847c8f9a6ff4834da99dab7ec9af0 (diff) | |
download | openscreen-282792c45b6d444a27e7af6bc80cab1f88ee0a15.tar.gz |
Use individual fields to initialize msg_hdr struct
The msg_hdr struct definition is different on musl vs. glibc and
contains extra padding fields, which disrupts initialization by
position. Initialize the struct to empty, and then set the individual
fields.
Change-Id: I14d0389769203c393948a5141a30fd8344d2bc23
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/3105068
Reviewed-by: mark a. foltz <mfoltz@chromium.org>
Commit-Queue: mark a. foltz <mfoltz@chromium.org>
-rw-r--r-- | platform/impl/network_interface_linux.cc | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/platform/impl/network_interface_linux.cc b/platform/impl/network_interface_linux.cc index 48351ae8..1678acd7 100644 --- a/platform/impl/network_interface_linux.cc +++ b/platform/impl/network_interface_linux.cc @@ -168,13 +168,14 @@ std::vector<InterfaceInfo> GetLinkInfo() { request.header.nlmsg_pid = 0; request.msg.ifi_family = AF_UNSPEC; struct iovec iov = {&request, request.header.nlmsg_len}; - struct msghdr msg = {&peer, - sizeof(peer), - &iov, - /* msg_iovlen */ 1, - /* msg_control */ nullptr, - /* msg_controllen */ 0, - /* msg_flags */ 0}; + struct msghdr msg = {}; + msg.msg_name = &peer; + msg.msg_namelen = sizeof(peer); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = nullptr; + msg.msg_controllen = 0; + msg.msg_flags = 0; if (sendmsg(fd.get(), &msg, 0) < 0) { OSP_LOG_ERROR << "netlink sendmsg() failed: " << errno << " - " << strerror(errno); @@ -187,14 +188,16 @@ std::vector<InterfaceInfo> GetLinkInfo() { char buf[kNetlinkRecvmsgBufSize]; struct iovec iov = {buf, sizeof(buf)}; struct sockaddr_nl source_address; - struct msghdr msg; + struct msghdr msg = {}; struct nlmsghdr* netlink_header; - msg = {&source_address, sizeof(source_address), &iov, - /* msg_iovlen */ 1, - /* msg_control */ nullptr, - /* msg_controllen */ 0, - /* msg_flags */ 0}; + msg.msg_name = &source_address; + msg.msg_namelen = sizeof(source_address); + msg.msg_iov = &iov; + msg.msg_iovlen = 1, + msg.msg_control = nullptr, + msg.msg_controllen = 0, + msg.msg_flags = 0; bool done = false; while (!done) { @@ -269,13 +272,14 @@ void PopulateSubnetsOrClearList(std::vector<InterfaceInfo>* info_list) { request.header.nlmsg_pid = 0; request.msg.ifa_family = AF_UNSPEC; struct iovec iov = {&request, request.header.nlmsg_len}; - struct msghdr msg = {&peer, - sizeof(peer), - &iov, - /* msg_iovlen */ 1, - /* msg_control */ nullptr, - /* msg_controllen */ 0, - /* msg_flags */ 0}; + struct msghdr msg = {}; + msg.msg_name = &peer; + msg.msg_namelen = sizeof(peer); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = nullptr; + msg.msg_controllen = 0; + msg.msg_flags = 0; if (sendmsg(fd.get(), &msg, 0) < 0) { OSP_LOG_ERROR << "sendmsg failed: " << errno << " - " << strerror(errno); info_list->clear(); @@ -287,14 +291,16 @@ void PopulateSubnetsOrClearList(std::vector<InterfaceInfo>* info_list) { char buf[kNetlinkRecvmsgBufSize]; struct iovec iov = {buf, sizeof(buf)}; struct sockaddr_nl source_address; - struct msghdr msg; + struct msghdr msg = {}; struct nlmsghdr* netlink_header; - msg = {&source_address, sizeof(source_address), &iov, - /* msg_iovlen */ 1, - /* msg_control */ nullptr, - /* msg_controllen */ 0, - /* msg_flags */ 0}; + msg.msg_name = &source_address; + msg.msg_namelen = sizeof(source_address); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = nullptr; + msg.msg_controllen = 0; + msg.msg_flags = 0; bool done = false; while (!done) { size_t len = recvmsg(fd.get(), &msg, 0); |