aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bayles <jophba@chromium.org>2021-06-29 12:04:17 -0700
committerOpenscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com>2021-06-29 19:51:57 +0000
commit082e0e3df7fcaeed60e49ac212e180b4dac6a39d (patch)
tree5d14a7e64b1e6085aa4e9e56cc4bfb134e45e70a
parent8a7173ad36859154874c17b107b450ee261a3697 (diff)
downloadopenscreen-082e0e3df7fcaeed60e49ac212e180b4dac6a39d.tar.gz
Add filtering for deprecated IPv6 addresses
On MacOSX, some specific IPv6 addresses are considered deprecated. This patch filters them from the network interface getters. Bug: b/155337148 Change-Id: Ib04f4ed64ec330fef9625fb42d474658213d9646 Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/2995022 Reviewed-by: Brandon Tolsch <btolsch@chromium.org> Commit-Queue: Jordan Bayles <jophba@chromium.org>
-rw-r--r--platform/impl/network_interface_mac.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/platform/impl/network_interface_mac.cc b/platform/impl/network_interface_mac.cc
index bb7bd583..e101beba 100644
--- a/platform/impl/network_interface_mac.cc
+++ b/platform/impl/network_interface_mac.cc
@@ -6,6 +6,7 @@
#include <net/if_dl.h>
#include <net/if_media.h>
#include <netinet/in.h>
+#include <netinet/in_var.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
@@ -133,6 +134,15 @@ std::vector<InterfaceInfo> ProcessInterfacesList(ifaddrs* interfaces) {
memcpy(&interface->hardware_address[0], &lladdr[0],
sizeof(interface->hardware_address));
} else if (cur->ifa_addr->sa_family == AF_INET6) { // Ipv6 address.
+ struct in6_ifreq ifr = {};
+ // Reject network interfaces that have a deprecated flag set.
+ strncpy(ifr.ifr_name, cur->ifa_name, sizeof(ifr.ifr_name) - 1);
+ memcpy(&ifr.ifr_ifru.ifru_addr, cur->ifa_addr, cur->ifa_addr->sa_len);
+ if (ioctl(ioctl_socket.get(), SIOCGIFAFLAG_IN6, &ifr) != 0 ||
+ ifr.ifr_ifru.ifru_flags & IN6_IFF_DEPRECATED) {
+ continue;
+ }
+
auto* const addr_in6 =
reinterpret_cast<const sockaddr_in6*>(cur->ifa_addr);
uint8_t tmp[sizeof(addr_in6->sin6_addr.s6_addr)];