network-utils: handle inet_ntop errors

This commit is contained in:
Wim Taymans 2025-01-09 16:28:51 +01:00
parent 2093fb2071
commit 1030000890

View file

@ -82,31 +82,33 @@ static inline int pw_net_parse_address_port(const char *address,
static inline int pw_net_get_ip(const struct sockaddr_storage *sa, char *ip, size_t len, bool *ip4, uint16_t *port) static inline int pw_net_get_ip(const struct sockaddr_storage *sa, char *ip, size_t len, bool *ip4, uint16_t *port)
{ {
if (ip4)
*ip4 = sa->ss_family == AF_INET;
if (sa->ss_family == AF_INET) { if (sa->ss_family == AF_INET) {
struct sockaddr_in *in = (struct sockaddr_in*)sa; struct sockaddr_in *in = (struct sockaddr_in*)sa;
inet_ntop(sa->ss_family, &in->sin_addr, ip, len); if (inet_ntop(sa->ss_family, &in->sin_addr, ip, len) == NULL)
return -errno;
if (port) if (port)
*port = ntohs(in->sin_port); *port = ntohs(in->sin_port);
} else if (sa->ss_family == AF_INET6) { } else if (sa->ss_family == AF_INET6) {
struct sockaddr_in6 *in = (struct sockaddr_in6*)sa; struct sockaddr_in6 *in = (struct sockaddr_in6*)sa;
inet_ntop(sa->ss_family, &in->sin6_addr, ip, len); if (inet_ntop(sa->ss_family, &in->sin6_addr, ip, len) == NULL)
return -errno;
if (port) if (port)
*port = ntohs(in->sin6_port); *port = ntohs(in->sin6_port);
if (in->sin6_scope_id == 0 || len <= 1)
goto finish;
size_t curlen = strlen(ip); if (in->sin6_scope_id != 0 && len > 1) {
if (len-(curlen+1) >= IFNAMSIZ) { size_t curlen = strlen(ip);
ip += curlen+1; if (len-(curlen+1) >= IFNAMSIZ) {
ip[-1] = '%'; ip += curlen+1;
if (if_indextoname(in->sin6_scope_id, ip) == NULL) ip[-1] = '%';
ip[-1] = 0; if (if_indextoname(in->sin6_scope_id, ip) == NULL)
ip[-1] = 0;
}
} }
} else } else
return -EINVAL; return -EINVAL;
finish:
if (ip4)
*ip4 = sa->ss_family == AF_INET;
return 0; return 0;
} }