Correctly handle IPv6 unspecified address in C API
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user