From 917b049030dcd58b055115c8cf72b85b1503d1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 26 Sep 2023 21:49:01 +0800 Subject: [PATCH] LocalIP: cache default route value --- CMakeLists.txt | 1 + src/common/netif/netif.c | 35 +++++++++++++++++++++++++ src/common/netif/netif.h | 4 +-- src/common/netif/netif_bsd.c | 9 ++++--- src/common/netif/netif_linux.c | 10 ++++--- src/common/netif/netif_windows.c | 2 +- src/detection/localip/localip_linux.c | 15 ++++++----- src/detection/localip/localip_windows.c | 12 ++++----- 8 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 src/common/netif/netif.c diff --git a/CMakeLists.txt b/CMakeLists.txt index c3b47e5cf..f780c91b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,6 +263,7 @@ set(LIBFASTFETCH_SRC src/common/jsonconfig.c src/common/library.c src/common/modules.c + src/common/netif/netif.c src/common/option.c src/common/parsing.c src/common/printing.c diff --git a/src/common/netif/netif.c b/src/common/netif/netif.c new file mode 100644 index 000000000..a6aed5730 --- /dev/null +++ b/src/common/netif/netif.c @@ -0,0 +1,35 @@ +#include "netif.h" + +#ifndef _WIN32 +#include + +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1]); + +const char* ffNetifGetDefaultRoute() +{ + static char iface[IF_NAMESIZE + 1]; + + if (*(uint16_t*) iface == 0) + { + if (!ffNetifGetDefaultRouteImpl(iface)) + iface[1] = 1; + } + + return iface; +} +#else +bool ffNetifGetDefaultRouteImpl(uint32_t* ifIndex); + +uint32_t ffNetifGetDefaultRoute() +{ + static uint32_t ifIndex = (uint32_t) -1; + + if (ifIndex == (uint32_t) -1) + { + if (!ffNetifGetDefaultRouteImpl(&ifIndex)) + ifIndex = (uint32_t) -2; + } + + return ifIndex; +} +#endif diff --git a/src/common/netif/netif.h b/src/common/netif/netif.h index c515df279..5b20e16f8 100644 --- a/src/common/netif/netif.h +++ b/src/common/netif/netif.h @@ -3,7 +3,7 @@ #include "fastfetch.h" #ifndef _WIN32 -bool ffNetifGetDefaultRoute(FFstrbuf* iface); +const char* ffNetifGetDefaultRoute(); #else -bool ffNetifGetDefaultRoute(uint32_t* ifIndex); +uint32_t ffNetifGetDefaultRoute(); #endif diff --git a/src/common/netif/netif_bsd.c b/src/common/netif/netif_bsd.c index f00177392..fcd657a30 100644 --- a/src/common/netif/netif_bsd.c +++ b/src/common/netif/netif_bsd.c @@ -2,6 +2,7 @@ #include "common/io/io.h" +#include #include #include #include @@ -38,9 +39,7 @@ get_rt_address(struct rt_msghdr *rtm, int desired) return NULL; } - - -bool ffNetifGetDefaultRoute(FFstrbuf* iface) +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1]) { //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 @@ -86,7 +85,9 @@ bool ffNetifGetDefaultRoute(FFstrbuf* iface) struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); if (sdl) { - ffStrbufSetNS(iface, sdl->sdl_nlen, sdl->sdl_data); + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); + iface[sdl->sdl_nlen] = '\0'; return true; } return false; diff --git a/src/common/netif/netif_linux.c b/src/common/netif/netif_linux.c index 299fd6034..f8b323b67 100644 --- a/src/common/netif/netif_linux.c +++ b/src/common/netif/netif_linux.c @@ -1,9 +1,13 @@ #include "netif.h" #include "common/io/io.h" +#include #include -bool ffNetifGetDefaultRoute(FFstrbuf* iface) +#define FF_STR_INDIR(x) #x +#define FF_STR(x) FF_STR_INDIR(x) + +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1]) { FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/route", "r"); if (!netRoute) return false; @@ -14,11 +18,9 @@ bool ffNetifGetDefaultRoute(FFstrbuf* iface) funlockfile(netRoute); unsigned long long destination; //, gateway, flags, refCount, use, metric, mask, mtu, - char buf[16 /*IF_NAMESIZE*/ + 1]; - while (fscanf(netRoute, "%16s%llx%*[^\n]", buf, &destination) == 2) + while (fscanf(netRoute, "%" FF_STR(IF_NAMESIZE) "s%llx%*[^\n]", iface, &destination) == 2) { if (destination != 0) continue; - ffStrbufSetS(iface, buf); return true; } return false; diff --git a/src/common/netif/netif_windows.c b/src/common/netif/netif_windows.c index d48cdbac8..3fc80ecba 100644 --- a/src/common/netif/netif_windows.c +++ b/src/common/netif/netif_windows.c @@ -3,7 +3,7 @@ #include -bool ffNetifGetDefaultRoute(uint32_t* ifIndex) +bool ffNetifGetDefaultRouteImpl(uint32_t* ifIndex) { ULONG size = 0; if (GetIpForwardTable(NULL, &size, TRUE) != ERROR_INSUFFICIENT_BUFFER) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 195ab2ae0..38cec4233 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -1,6 +1,7 @@ #include "localip.h" #include "common/io/io.h" #include "common/netif/netif.h" +#include "util/stringUtils.h" #include #include @@ -56,15 +57,15 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if(getifaddrs(&ifAddrStruct) < 0) return "getifaddrs(&ifAddrStruct) failed"; - FF_STRBUF_AUTO_DESTROY defaultRouteIface = ffStrbufCreate(); - ffNetifGetDefaultRoute(&defaultRouteIface); + const char* defaultRouteIface = ffNetifGetDefaultRoute(); for (struct ifaddrs* ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next) { if (!ifa->ifa_addr || !(ifa->ifa_flags & IFF_RUNNING)) continue; - if (options->defaultRouteOnly && !ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name)) + bool isDefaultRoute = ffStrEquals(defaultRouteIface, ifa->ifa_name); + if (options->defaultRouteOnly && !isDefaultRoute) continue; if ((ifa->ifa_flags & IFF_LOOPBACK) && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)) @@ -81,7 +82,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); - addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name)); + addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, isDefaultRoute); } else if (ifa->ifa_addr->sa_family == AF_INET6) { @@ -91,7 +92,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); - addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name)); + addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRoute); } #if defined(__FreeBSD__) || defined(__APPLE__) else if (ifa->ifa_addr->sa_family == AF_LINK) @@ -103,7 +104,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr); snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name)); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute); } #else else if (ifa->ifa_addr->sa_family == AF_PACKET) @@ -115,7 +116,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = ((struct sockaddr_ll *)ifa->ifa_addr)->sll_addr; snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name)); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute); } #endif } diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 78552be5b..8863843fd 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -70,13 +70,13 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) return "GetAdaptersAddresses() failed"; } - uint32_t defaultRouteIfIndex = (uint32_t)-1; - ffNetifGetDefaultRoute(&defaultRouteIfIndex); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRoute(); // Iterate through all of the adapters for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) { - if (options->defaultRouteOnly && adapter->IfIndex != defaultRouteIfIndex) + bool isDefaultRoute = adapter->IfIndex == defaultRouteIfIndex; + if (options->defaultRouteOnly && !isDefaultRoute) continue; bool isLoop = adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK; @@ -96,7 +96,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = adapter->PhysicalAddress; snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, name, addressBuffer, -1, newIp, adapter->IfIndex == defaultRouteIfIndex); + addNewIp(results, name, addressBuffer, -1, newIp, isDefaultRoute); newIp = false; } @@ -107,7 +107,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) SOCKADDR_IN* ipv4 = (SOCKADDR_IN*) ifa->Address.lpSockaddr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); - addNewIp(results, name, addressBuffer, AF_INET, newIp, adapter->IfIndex == defaultRouteIfIndex); + addNewIp(results, name, addressBuffer, AF_INET, newIp, isDefaultRoute); newIp = false; } else if (ifa->Address.lpSockaddr->sa_family == AF_INET6) @@ -115,7 +115,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) SOCKADDR_IN6* ipv6 = (SOCKADDR_IN6*) ifa->Address.lpSockaddr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); - addNewIp(results, name, addressBuffer, AF_INET6, newIp, adapter->IfIndex == defaultRouteIfIndex); + addNewIp(results, name, addressBuffer, AF_INET6, newIp, isDefaultRoute); newIp = false; } }