From 0aae26349249663a99133c30c85ac34a606dfe13 Mon Sep 17 00:00:00 2001 From: nickkelsey Date: Fri, 21 Oct 2022 20:02:07 -0700 Subject: [PATCH] 20221021 --- hdhomerun_sock_getifaddrs.c | 29 ++++++++++++++++++++--------- hdhomerun_sock_netdevice.c | 6 ++++++ hdhomerun_sock_netlink.c | 8 ++++++++ hdhomerun_sock_windows.c | 11 ++++++++--- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/hdhomerun_sock_getifaddrs.c b/hdhomerun_sock_getifaddrs.c index 72c5003..6c105cf 100644 --- a/hdhomerun_sock_getifaddrs.c +++ b/hdhomerun_sock_getifaddrs.c @@ -93,11 +93,19 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba continue; } - if (ifa->ifa_addr->sa_family == AF_INET) { - uint32_t ifindex = if_nametoindex(ifa->ifa_name); + uint32_t ifindex = if_nametoindex(ifa->ifa_name); + if (ifindex == 0) { + ifa = ifa->ifa_next; + continue; + } + if (ifa->ifa_addr->sa_family == AF_INET) { struct sockaddr_in *netmask_in = (struct sockaddr_in *)ifa->ifa_netmask; uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr((uint8_t *)&netmask_in->sin_addr.s_addr, 4); + if ((cidr == 0) || (cidr >= 32)) { + ifa = ifa->ifa_next; + continue; + } callback(callback_arg, ifindex, ifa->ifa_addr, cidr); @@ -106,6 +114,13 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba } if (ifa->ifa_addr->sa_family == AF_INET6) { + struct sockaddr_in6 *netmask_in = (struct sockaddr_in6 *)ifa->ifa_netmask; + uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr(netmask_in->sin6_addr.s6_addr, 16); + if ((cidr == 0) || (cidr >= 128)) { + ifa = ifa->ifa_next; + continue; + } + #if !defined(TARGET_OS_IPHONE) struct in6_ifreq ifr6; memset(&ifr6, 0, sizeof(ifr6)); @@ -114,21 +129,17 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba strcpy(ifr6.ifr_name, ifa->ifa_name); ifr6.ifr_addr = *addr_in; - if (ioctl(af6_sock, SIOCGIFALIFETIME_IN6, &ifr6) < 0) { + if (ioctl(af6_sock, SIOCGIFAFLAG_IN6, &ifr6) < 0) { ifa = ifa->ifa_next; continue; } - if (ifr6.ifr_ifru.ifru_lifetime.ia6t_vltime != 0xFFFFFFFF) { + uint32_t flags6 = ifr6.ifr_ifru.ifru_flags6; + if (flags6 & (IN6_IFF_ANYCAST | IN6_IFF_TENTATIVE | IN6_IFF_DETACHED | IN6_IFF_TEMPORARY | IN6_IFF_DEPRECATED)) { ifa = ifa->ifa_next; continue; } #endif - uint32_t ifindex = if_nametoindex(ifa->ifa_name); - - struct sockaddr_in6 *netmask_in = (struct sockaddr_in6 *)ifa->ifa_netmask; - uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr(netmask_in->sin6_addr.s6_addr, 16); - callback(callback_arg, ifindex, ifa->ifa_addr, cidr); ifa = ifa->ifa_next; diff --git a/hdhomerun_sock_netdevice.c b/hdhomerun_sock_netdevice.c index c1a569d..39dd3f6 100644 --- a/hdhomerun_sock_netdevice.c +++ b/hdhomerun_sock_netdevice.c @@ -110,6 +110,9 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba struct sockaddr_in *netmask_in = (struct sockaddr_in *)&ifr->ifr_addr; uint8_t cidr = hdhomerun_local_ip_netmask_to_cidr((uint8_t *)&netmask_in->sin_addr.s_addr, 4); + if ((cidr == 0) || (cidr >= 32)) { + continue; + } /* ifindex. */ if (ioctl(sock, SIOCGIFINDEX, ifr) != 0) { @@ -117,6 +120,9 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba } uint32_t ifindex = ifr->ifr_ifindex; + if (ifindex == 0) { + continue; + } /* Result. */ callback(callback_arg, ifindex, (const struct sockaddr *)&ip_addr_in, cidr); diff --git a/hdhomerun_sock_netlink.c b/hdhomerun_sock_netlink.c index 7fcab15..83e94a1 100644 --- a/hdhomerun_sock_netlink.c +++ b/hdhomerun_sock_netlink.c @@ -46,6 +46,9 @@ static void hdhomerun_local_ip_info2_newaddr(int af_sock, struct nlmsghdr *hdr, /* ifindex */ uint32_t ifindex = addrmsg->ifa_index; + if (ifindex == 0) { + return; + } /* interface flags */ struct ifreq ifr; @@ -78,6 +81,11 @@ static void hdhomerun_local_ip_info2_newaddr(int af_sock, struct nlmsghdr *hdr, } uint8_t cidr = (uint8_t)addrmsg->ifa_prefixlen; + uint8_t cidr_fail = (addrmsg->ifa_family == AF_INET6) ? 128 : 32; + if ((cidr == 0) || (cidr >= cidr_fail)) { + rta = RTA_NEXT(rta, ifa_payload_length); + continue; + } if (addrmsg->ifa_family == AF_INET) { struct sockaddr_in local_ip; diff --git a/hdhomerun_sock_windows.c b/hdhomerun_sock_windows.c index d5979e7..d225471 100644 --- a/hdhomerun_sock_windows.c +++ b/hdhomerun_sock_windows.c @@ -77,6 +77,10 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba } uint32_t ifindex = adapter->IfIndex; + if (ifindex == 0) { + adapter = adapter->Next; + continue; + } IP_ADAPTER_UNICAST_ADDRESS *adapter_address = adapter->FirstUnicastAddress; while (adapter_address) { @@ -91,12 +95,13 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba continue; } - if ((local_ip->sa_family == AF_INET6) && (adapter_address->ValidLifetime != 0xFFFFFFFF)) { + uint8_t cidr = adapter_address->OnLinkPrefixLength; + uint8_t cidr_fail = (local_ip->sa_family == AF_INET6) ? 128 : 32; + if ((cidr == 0) || (cidr >= cidr_fail)) { adapter_address = adapter_address->Next; - continue; /* skip temporary addresses */ + continue; } - uint8_t cidr = adapter_address->OnLinkPrefixLength; callback(callback_arg, ifindex, local_ip, cidr); adapter_address = adapter_address->Next;