diff options
| author | drkhsh <me@drkhsh.at> | 2026-06-23 22:51:47 +0200 |
|---|---|---|
| committer | drkhsh <me@drkhsh.at> | 2026-06-24 00:12:59 +0200 |
| commit | 675c83912ea1aca9834448aaa87a040bc9990c52 (patch) | |
| tree | 7f5e51ee505ffc25f42835746067c64c62ff4806 | |
| parent | 0dc0c59dbefbd38a8c59004e941260a26fe4bccf (diff) | |
| download | slstatus-675c83912ea1aca9834448aaa87a040bc9990c52.tar.gz | |
fix getnameinfo sockaddr size for IPv4
pass sizeof(struct sockaddr_in) for AF_INET instead of always using
sizeof(struct sockaddr_in6). also skip getnameinfo entirely for
non-matching interfaces rather than calling it for every entry.
| -rw-r--r-- | components/ip.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/components/ip.c b/components/ip.c index 2cdad46..ac75661 100644 --- a/components/ip.c +++ b/components/ip.c @@ -30,18 +30,20 @@ ip(const char *interface, unsigned short sa_family) for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) continue; + if (strcmp(ifa->ifa_name, interface) || + ifa->ifa_addr->sa_family != sa_family) + continue; - s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), + s = getnameinfo(ifa->ifa_addr, + (sa_family == AF_INET) ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - if (!strcmp(ifa->ifa_name, interface) && - (ifa->ifa_addr->sa_family == sa_family)) { - freeifaddrs(ifaddr); - if (s != 0) { - warn("getnameinfo: %s", gai_strerror(s)); - return NULL; - } - return bprintf("%s", host); + freeifaddrs(ifaddr); + if (s != 0) { + warn("getnameinfo: %s", gai_strerror(s)); + return NULL; } + return bprintf("%s", host); } freeifaddrs(ifaddr); |
