aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2021-08-16 12:56:46 -0700
committerOpenscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com>2021-08-20 23:52:58 +0000
commit282792c45b6d444a27e7af6bc80cab1f88ee0a15 (patch)
treee93e753cd6e26b905f69fc53079b6f664f204167
parentc1ba479f10d847c8f9a6ff4834da99dab7ec9af0 (diff)
downloadopenscreen-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.cc58
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);