diff --git a/lib/isc/sockaddr.c b/lib/isc/sockaddr.c index e3187bb794..087da21b26 100644 --- a/lib/isc/sockaddr.c +++ b/lib/isc/sockaddr.c @@ -110,43 +110,39 @@ isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b, isc_result_t isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target) { - char abuf[sizeof "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255"]; - unsigned int alen; + isc_result_t result; + isc_netaddr_t netaddr; char pbuf[sizeof "65000"]; unsigned int plen; isc_region_t avail; - const struct sockaddr *sa; - const struct sockaddr_in *sin; - const struct sockaddr_in6 *sin6; REQUIRE(sockaddr != NULL); - sa = &sockaddr->type.sa; - switch (sa->sa_family) { + isc_netaddr_fromsockaddr(&netaddr, sockaddr); + result = isc_netaddr_totext(&netaddr, target); + if (result != ISC_R_SUCCESS) + return (result); + + switch (sockaddr->type.sa.sa_family) { case AF_INET: - sin = &sockaddr->type.sin; - inet_ntop(sa->sa_family, &sin->sin_addr, abuf, sizeof abuf); - sprintf(pbuf, "%u", ntohs(sin->sin_port)); + sprintf(pbuf, "%u", ntohs(sockaddr->type.sin.sin_port)); break; case AF_INET6: - sin6 = &sockaddr->type.sin6; - inet_ntop(sa->sa_family, &sin6->sin6_addr, abuf, sizeof abuf); - sprintf(pbuf, "%u", ntohs(sin6->sin6_port)); + sprintf(pbuf, "%u", ntohs(sockaddr->type.sin6.sin6_port)); break; default: - return (ISC_R_NOTIMPLEMENTED); + INSIST(0); + break; } - alen = strlen(abuf); plen = strlen(pbuf); - - isc_buffer_availableregion(target, &avail); - if (alen + 1 + plen + 1 > avail.length) + INSIST(plen < sizeof(pbuf)); + + if (1 + plen + 1 > isc_buffer_availablelength(target)) return (ISC_R_NOSPACE); - isc_buffer_putmem(target, (unsigned char *) abuf, alen); isc_buffer_putmem(target, (unsigned char *)"#", 1); - isc_buffer_putmem(target, (unsigned char *) pbuf, plen); + isc_buffer_putmem(target, (unsigned char *)pbuf, plen); /* Null terminate after used region. */ isc_buffer_availableregion(target, &avail);