Correctly handle IPv6 unspecified address in C API

This commit is contained in:
Joseph Henry
2021-05-19 00:52:52 -07:00
parent 840a5159b3
commit 08cf10278e

View File

@@ -367,15 +367,20 @@ int zts_util_ipstr_to_saddr(
*addrlen = sizeof(struct zts_sockaddr_in); *addrlen = sizeof(struct zts_sockaddr_in);
return ZTS_ERR_OK; return ZTS_ERR_OK;
} }
int any = 0;
if (family == ZTS_AF_INET6) { if (family == ZTS_AF_INET6) {
struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)dest_addr; struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)dest_addr;
in6->sin6_port = htons(port); in6->sin6_port = htons(port);
in6->sin6_family = family; in6->sin6_family = family;
#if defined(_WIN32) // Handle the unspecified address
zts_inet_pton(family, src_ipstr, &(in6->sin6_addr)); any = ((strlen(src_ipstr) >= 2) && !strncmp(src_ipstr, "::", 2))
#else || ((strlen(src_ipstr) >= 15) && !strncmp(src_ipstr, "0:0:0:0:0:0:0:0", 15)) ? 1 : 0;
zts_inet_pton(family, src_ipstr, &(in6->sin6_addr)); if (!any) {
#endif zts_inet_pton(family, src_ipstr, &(in6->sin6_addr));
}
else {
memset((void*)&(in6->sin6_addr), 0, sizeof(zts_in6_addr));
}
*addrlen = sizeof(struct zts_sockaddr_in6); *addrlen = sizeof(struct zts_sockaddr_in6);
return ZTS_ERR_OK; return ZTS_ERR_OK;
} }