Reduce sizeof isc_sockaddr from 152 to 48 bytes

After removing sockaddr_unix from isc_sockaddr, we can also remove
sockaddr_storage and reduce the isc_sockaddr size from 152 bytes to just
48 bytes needed to hold IPv6 addresses.

(cherry picked from commit 2367b6a2e1)
This commit is contained in:
Ondřej Surý
2023-09-12 09:21:53 +02:00
parent e487294ce4
commit a7630c2c62
4 changed files with 9 additions and 40 deletions

View File

@@ -247,7 +247,7 @@ add_server(isc_mem_t *mctx, const char *address_str,
goto cleanup;
}
address->length = (unsigned int)res->ai_addrlen;
memmove(&address->type.ss, res->ai_addr, res->ai_addrlen);
memmove(&address->type.sa, res->ai_addr, res->ai_addrlen);
ISC_LINK_INIT(address, link);
ISC_LIST_APPEND(*nameservers, address, link);

View File

@@ -29,11 +29,9 @@
*/
struct isc_sockaddr {
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
struct sockaddr_storage ss;
struct sockaddr_un sunix;
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} type;
unsigned int length; /* XXXRTH beginning? */
ISC_LINK(struct isc_sockaddr) link;

View File

@@ -348,10 +348,6 @@ isc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) {
memmove(&t->type.in6, &s->type.sin6.sin6_addr, 16);
t->zone = s->type.sin6.sin6_scope_id;
break;
case AF_UNIX:
memmove(t->type.un, s->type.sunix.sun_path, sizeof(t->type.un));
t->zone = 0;
break;
default:
UNREACHABLE();
}

View File

@@ -137,24 +137,7 @@ isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target) {
ntohs(sockaddr->type.sin6.sin6_port));
break;
case AF_UNIX:
plen = strlen(sockaddr->type.sunix.sun_path);
if (plen >= isc_buffer_availablelength(target)) {
return ISC_R_NOSPACE;
}
isc_buffer_putmem(
target,
(const unsigned char *)sockaddr->type.sunix.sun_path,
plen);
/*
* Null terminate after used region.
*/
isc_buffer_availableregion(target, &avail);
INSIST(avail.length >= 1);
avail.base[0] = '\0';
return ISC_R_SUCCESS;
return ISC_R_NOTIMPLEMENTED;
default:
return ISC_R_FAILURE;
}
@@ -461,16 +444,9 @@ isc_sockaddr_isnetzero(const isc_sockaddr_t *sockaddr) {
}
isc_result_t
isc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path) {
if (strlen(path) >= sizeof(sockaddr->type.sunix.sun_path)) {
return ISC_R_NOSPACE;
}
memset(sockaddr, 0, sizeof(*sockaddr));
sockaddr->length = sizeof(sockaddr->type.sunix);
sockaddr->type.sunix.sun_family = AF_UNIX;
strlcpy(sockaddr->type.sunix.sun_path, path,
sizeof(sockaddr->type.sunix.sun_path));
return ISC_R_SUCCESS;
isc_sockaddr_frompath(isc_sockaddr_t *sockaddr ISC_ATTR_UNUSED,
const char *path ISC_ATTR_UNUSED) {
return ISC_R_NOTIMPLEMENTED;
}
isc_result_t
@@ -485,8 +461,7 @@ isc_sockaddr_fromsockaddr(isc_sockaddr_t *isa, const struct sockaddr *sa) {
length = sizeof(isa->type.sin6);
break;
case AF_UNIX:
length = sizeof(isa->type.sunix);
break;
return ISC_R_NOTIMPLEMENTED;
default:
return ISC_R_NOTIMPLEMENTED;
}