]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
reduce the size of cfg_obj by using pointers for addresses
authorEvan Hunt <each@isc.org>
Thu, 30 Oct 2025 20:40:10 +0000 (13:40 -0700)
committerEvan Hunt <each@isc.org>
Thu, 30 Oct 2025 22:17:21 +0000 (15:17 -0700)
instead of having sockaddr and netaddr members in the cfg_obj->value
union, we now just keep pointers, and allocate memory when parsing
these types. this reduces the size of cfg_obj_t from 112 to 80 bytes.

lib/isccfg/include/isccfg/grammar.h
lib/isccfg/namedconf.c
lib/isccfg/parser.c

index 03e52ae72632361405effe6aa3bf4aa5432f1200..8930d6a03b3aa4477272225c39899b0e0ac95d70 100644 (file)
@@ -210,12 +210,12 @@ struct cfg_obj {
                cfg_map_t        map;
                cfg_list_t       list;
                cfg_obj_t      **tuple;
-               isc_sockaddr_t   sockaddr;
+               isc_sockaddr_t  *sockaddr;
                struct {
-                       isc_sockaddr_t   sockaddr;
+                       isc_sockaddr_t  *sockaddr;
                        isc_textregion_t tls;
                } sockaddrtls;
-               cfg_netprefix_t   netprefix;
+               cfg_netprefix_t  *netprefix;
                isccfg_duration_t duration;
        } value;
        cfg_obj_t   *file; /*%< separate string with its own refcount */
index 19825db929c032b8f8e4f84026ca40c86622e2cb..0145f2b484878d5652c9d08eb0626331fcf16bac 100644 (file)
@@ -3586,7 +3586,7 @@ cleanup:
 static void
 print_querysource(cfg_printer_t *pctx, const cfg_obj_t *obj) {
        isc_netaddr_t na;
-       isc_netaddr_fromsockaddr(&na, &obj->value.sockaddr);
+       isc_netaddr_fromsockaddr(&na, obj->value.sockaddr);
        cfg_print_rawaddr(pctx, &na);
 }
 
index f59d747309a3e15b3819b9003152b43dad534ee6..cb50b634c9548fbb4df6bad3391b886d59d6ef55 100644 (file)
@@ -128,6 +128,9 @@ create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
 static void
 free_string(cfg_obj_t *obj);
 
+static void
+free_sockaddr(cfg_obj_t *obj);
+
 static void
 free_sockaddrtls(cfg_obj_t *obj);
 
@@ -192,12 +195,17 @@ copy_boolean(cfg_obj_t *to, const cfg_obj_t *from) {
 
 static void
 copy_sockaddr(cfg_obj_t *to, const cfg_obj_t *from) {
-       to->value.sockaddr = from->value.sockaddr;
+       to->value.sockaddr = isc_mem_get(to->mctx, sizeof(isc_sockaddr_t));
+       memmove(to->value.sockaddr, from->value.sockaddr,
+               sizeof(isc_sockaddr_t));
 }
 
 static void
 copy_sockaddrtls(cfg_obj_t *to, const cfg_obj_t *from) {
-       to->value.sockaddrtls.sockaddr = from->value.sockaddrtls.sockaddr;
+       to->value.sockaddrtls.sockaddr = isc_mem_get(to->mctx,
+                                                    sizeof(isc_sockaddr_t));
+       memmove(to->value.sockaddrtls.sockaddr,
+               from->value.sockaddrtls.sockaddr, sizeof(isc_sockaddr_t));
 
        if (from->value.sockaddrtls.tls.base != NULL) {
                size_t len = from->value.sockaddrtls.tls.length;
@@ -209,9 +217,16 @@ copy_sockaddrtls(cfg_obj_t *to, const cfg_obj_t *from) {
        }
 }
 
+static void
+free_netprefix(cfg_obj_t *obj) {
+       isc_mem_put(obj->mctx, obj->value.netprefix, sizeof(cfg_netprefix_t));
+}
+
 static void
 copy_netprefix(cfg_obj_t *to, const cfg_obj_t *from) {
-       to->value.netprefix = from->value.netprefix;
+       to->value.netprefix = isc_mem_get(to->mctx, sizeof(cfg_netprefix_t));
+       memmove(to->value.netprefix, from->value.netprefix,
+               sizeof(cfg_netprefix_t));
 }
 
 static void
@@ -330,10 +345,10 @@ cfg_rep_t cfg_rep_boolean = { "boolean", free_noop, copy_boolean };
 cfg_rep_t cfg_rep_map = { "map", free_map, copy_map };
 cfg_rep_t cfg_rep_list = { "list", free_list, copy_list };
 cfg_rep_t cfg_rep_tuple = { "tuple", free_tuple, copy_tuple };
-cfg_rep_t cfg_rep_sockaddr = { "sockaddr", free_noop, copy_sockaddr };
+cfg_rep_t cfg_rep_sockaddr = { "sockaddr", free_sockaddr, copy_sockaddr };
 cfg_rep_t cfg_rep_sockaddrtls = { "sockaddrtls", free_sockaddrtls,
                                  copy_sockaddrtls };
-cfg_rep_t cfg_rep_netprefix = { "netprefix", free_noop, copy_netprefix };
+cfg_rep_t cfg_rep_netprefix = { "netprefix", free_netprefix, copy_netprefix };
 cfg_rep_t cfg_rep_void = { "void", free_noop, copy_noop };
 cfg_rep_t cfg_rep_fixedpoint = { "fixedpoint", free_noop, copy_uint32 };
 cfg_rep_t cfg_rep_percentage = { "percentage", free_noop, copy_uint32 };
@@ -1683,8 +1698,15 @@ free_string(cfg_obj_t *obj) {
                    obj->value.string.length + 1);
 }
 
+static void
+free_sockaddr(cfg_obj_t *obj) {
+       isc_mem_put(obj->mctx, obj->value.sockaddr, sizeof(isc_sockaddr_t));
+}
+
 static void
 free_sockaddrtls(cfg_obj_t *obj) {
+       isc_mem_put(obj->mctx, obj->value.sockaddrtls.sockaddr,
+                   sizeof(isc_sockaddr_t));
        if (obj->value.sockaddrtls.tls.base != NULL) {
                INSIST(obj->value.sockaddrtls.tls.length != 0);
                isc_mem_put(obj->mctx, obj->value.sockaddrtls.tls.base,
@@ -3237,10 +3259,11 @@ parse_netaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        isc_netaddr_t netaddr;
        unsigned int flags = *(const unsigned int *)type->of;
 
+       CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
        cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
                       type, &obj);
-       CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
-       isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, 0);
+       obj->value.sockaddr = isc_mem_get(obj->mctx, sizeof(isc_sockaddr_t));
+       isc_sockaddr_fromnetaddr(obj->value.sockaddr, &netaddr, 0);
        *ret = obj;
        return ISC_R_SUCCESS;
 cleanup:
@@ -3367,8 +3390,9 @@ cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
        }
        cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_netprefix, &obj);
-       obj->value.netprefix.address = netaddr;
-       obj->value.netprefix.prefixlen = prefixlen;
+       obj->value.netprefix = isc_mem_get(obj->mctx, sizeof(cfg_netprefix_t));
+       obj->value.netprefix->address = netaddr;
+       obj->value.netprefix->prefixlen = prefixlen;
        *ret = obj;
        return ISC_R_SUCCESS;
 cleanup:
@@ -3378,14 +3402,11 @@ cleanup:
 
 static void
 print_netprefix(cfg_printer_t *pctx, const cfg_obj_t *obj) {
-       const cfg_netprefix_t *p;
-
        REQUIRE(VALID_CFGOBJ(obj));
 
-       p = &obj->value.netprefix;
-       cfg_print_rawaddr(pctx, &p->address);
+       cfg_print_rawaddr(pctx, &obj->value.netprefix->address);
        cfg_print_cstr(pctx, "/");
-       cfg_print_rawuint(pctx, p->prefixlen);
+       cfg_print_rawuint(pctx, obj->value.netprefix->prefixlen);
 }
 
 bool
@@ -3402,8 +3423,8 @@ cfg_obj_asnetprefix(const cfg_obj_t *obj, isc_netaddr_t *netaddr,
        REQUIRE(netaddr != NULL);
        REQUIRE(prefixlen != NULL);
 
-       *netaddr = obj->value.netprefix.address;
-       *prefixlen = obj->value.netprefix.prefixlen;
+       *netaddr = obj->value.netprefix->address;
+       *prefixlen = obj->value.netprefix->prefixlen;
 }
 
 cfg_type_t cfg_type_netprefix = { "netprefix",       cfg_parse_netprefix,
@@ -3503,7 +3524,10 @@ parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type, int flags,
        if (have_tls == 1) {
                obj->value.sockaddrtls.tls = tls;
        }
-       isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, port);
+       obj->value.sockaddrtls.sockaddr = isc_mem_get(obj->mctx,
+                                                     sizeof(isc_sockaddr_t));
+       isc_sockaddr_fromnetaddr(obj->value.sockaddrtls.sockaddr, &netaddr,
+                                port);
        *ret = obj;
        return ISC_R_SUCCESS;
 
@@ -3564,10 +3588,10 @@ cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj) {
        REQUIRE(pctx != NULL);
        REQUIRE(VALID_CFGOBJ(obj));
 
-       isc_netaddr_fromsockaddr(&netaddr, &obj->value.sockaddr);
+       isc_netaddr_fromsockaddr(&netaddr, obj->value.sockaddr);
        isc_netaddr_format(&netaddr, buf, sizeof(buf));
        cfg_print_cstr(pctx, buf);
-       port = isc_sockaddr_getport(&obj->value.sockaddr);
+       port = isc_sockaddr_getport(obj->value.sockaddr);
        if (port != 0) {
                cfg_print_cstr(pctx, " port ");
                cfg_print_rawuint(pctx, port);
@@ -3638,7 +3662,7 @@ cfg_obj_assockaddr(const cfg_obj_t *obj) {
        REQUIRE(VALID_CFGOBJ(obj));
        REQUIRE(obj->type->rep == &cfg_rep_sockaddr ||
                obj->type->rep == &cfg_rep_sockaddrtls);
-       return &obj->value.sockaddr;
+       return obj->value.sockaddr;
 }
 
 const char *