]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
remove memory context from parser context
authorColin Vidal <colin@isc.org>
Tue, 4 Nov 2025 09:49:40 +0000 (10:49 +0100)
committerColin Vidal <colin@isc.org>
Thu, 4 Dec 2025 15:09:40 +0000 (16:09 +0100)
As the isccfg library now uses the global memory context, it is now
used directly instead of passing the parser context around to grab its
memory context.

Also remove the memory context from the parser, as well as from
`cfg_obj_t`, as it's now useless.

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

index 0018942fb5bc582d42aa1f77eeeb215217f5c691..975385409edd31c6418d4ca81f3554545767b89e 100644 (file)
@@ -199,7 +199,6 @@ struct cfg_rep {
 
 struct cfg_obj {
        unsigned int   magic;
-       isc_mem_t     *mctx;
        isc_refcount_t references;
 
        /*%
@@ -238,7 +237,6 @@ struct cfg_listelt {
 
 /*% The parser object. */
 struct cfg_parser {
-       isc_mem_t   *mctx;
        isc_lex_t   *lexer;
        unsigned int errors;
        unsigned int warnings;
@@ -376,8 +374,8 @@ cfg_ungettoken(cfg_parser_t *pctx);
 #define CFG_LEXOPT_QSTRING (ISC_LEXOPT_QSTRING | ISC_LEXOPT_QSTRINGMULTILINE)
 
 void
-cfg_obj_create(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
-              const cfg_type_t *type, cfg_obj_t **ret);
+cfg_obj_create(cfg_obj_t *file, size_t line, const cfg_type_t *type,
+              cfg_obj_t **ret);
 
 void
 cfg_string_create(cfg_parser_t *pctx, const char *contents,
@@ -465,6 +463,9 @@ isc_result_t
 cfg_parse_listelt(cfg_parser_t *pctx, cfg_obj_t *list,
                  const cfg_type_t *elttype, cfg_listelt_t **ret);
 
+void
+cfg_listelt_create(cfg_listelt_t **ret);
+
 isc_result_t
 cfg_parse_bracketed_list(cfg_parser_t *pctx, const cfg_type_t *type,
                         cfg_obj_t **ret);
index 455ef114aedfabc9039cd72253eb2f0a23614a79..c6ecbf041b1f236a5ae0ef661da8d1d953907924 100644 (file)
@@ -963,8 +963,8 @@ parse_qstringornone(cfg_parser_t *pctx, const cfg_type_t *type,
        if (pctx->token.type == isc_tokentype_string &&
            strcasecmp(TOKEN_STRING(pctx), "none") == 0)
        {
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_none, ret);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_none, ret);
                return ISC_R_SUCCESS;
        }
        cfg_ungettoken(pctx);
@@ -1007,8 +1007,8 @@ parse_boolorauto(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        if (pctx->token.type == isc_tokentype_string &&
            strcasecmp(TOKEN_STRING(pctx), "auto") == 0)
        {
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_auto, ret);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_auto, ret);
                return ISC_R_SUCCESS;
        }
        cfg_ungettoken(pctx);
@@ -1063,15 +1063,15 @@ parse_serverid(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        if (pctx->token.type == isc_tokentype_string &&
            strcasecmp(TOKEN_STRING(pctx), "none") == 0)
        {
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_none, ret);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_none, ret);
                return ISC_R_SUCCESS;
        }
        if (pctx->token.type == isc_tokentype_string &&
            strcasecmp(TOKEN_STRING(pctx), "hostname") == 0)
        {
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_hostname, ret);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_hostname, ret);
                (*ret)->value.boolean = true;
                return ISC_R_SUCCESS;
        }
@@ -2306,9 +2306,9 @@ checknames_merge(const cfg_obj_t *config ISC_ATTR_UNUSED,
                }
 
                if (found == false) {
-                       cfg_listelt_t *eelt = isc_mem_get(effectiveobj->mctx,
-                                                         sizeof(*eelt));
+                       cfg_listelt_t *eelt = NULL;
 
+                       cfg_listelt_create(&eelt);
                        *eelt = (cfg_listelt_t){ .link = ISC_LINK_INITIALIZER };
                        cfg_obj_clone(checkname, &eelt->obj);
                        ISC_LIST_APPEND(effectiveobj->value.list, eelt, link);
@@ -3158,7 +3158,7 @@ parse_sizeval(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        }
        CHECK(parse_unitstring(TOKEN_STRING(pctx), &val));
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_uint64, &obj);
        obj->value.uint64 = val;
        *ret = obj;
@@ -3189,15 +3189,15 @@ parse_sizeval_percent(cfg_parser_t *pctx, const cfg_type_t *type,
        percent = strtoull(TOKEN_STRING(pctx), &endp, 10);
 
        if (*endp == '%' && *(endp + 1) == 0) {
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_percentage, &obj);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_percentage, &obj);
                obj->value.uint32 = (uint32_t)percent;
                *ret = obj;
                return ISC_R_SUCCESS;
        } else {
                CHECK(parse_unitstring(TOKEN_STRING(pctx), &val));
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_uint64, &obj);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_uint64, &obj);
                obj->value.uint64 = val;
                *ret = obj;
                return ISC_R_SUCCESS;
@@ -3623,8 +3623,8 @@ parse_querysource(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
            strcasecmp(TOKEN_STRING(pctx), "none") == 0)
        {
                CHECK(cfg_gettoken(pctx, 0));
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_none, ret);
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_none, ret);
        } else {
                CHECK(cfg_parse_sockaddr_generic(pctx, &cfg_type_querysource,
                                                 type, ret));
@@ -3825,8 +3825,8 @@ parse_logseverity(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
                         * This makes little sense, but we support it for
                         * compatibility with BIND 8.
                         */
-                       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                                      pctx->line, &cfg_type_uint32, ret);
+                       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                                      &cfg_type_uint32, ret);
                        (*ret)->value.uint32 = 1;
                }
                (*ret)->type = &cfg_type_debuglevel; /* XXX kludge */
index 202609a6f4d643e55cbb79c679ffb9a81da61378..8b9a99c8e4175196eeca50da49e5b88c364023fe 100644 (file)
@@ -39,7 +39,6 @@
 
 /*! \file */
 
-#include <ctype.h>
 #include <errno.h>
 #include <glob.h>
 #include <inttypes.h>
@@ -109,10 +108,8 @@ static void
 free_list(cfg_obj_t *obj);
 
 static void
-create_list(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
-           const cfg_type_t *type, cfg_obj_t **obj);
-static void
-create_listelt(cfg_obj_t *list, cfg_listelt_t **eltp);
+create_list(cfg_obj_t *file, size_t line, const cfg_type_t *type,
+           cfg_obj_t **obj);
 
 static void
 free_string(cfg_obj_t *obj);
@@ -162,8 +159,7 @@ cfg_obj_clone(const cfg_obj_t *source, cfg_obj_t **target) {
        REQUIRE(source->type->rep->copy != NULL);
        REQUIRE(target != NULL && *target == NULL);
 
-       cfg_obj_create(source->mctx, source->file, source->line, source->type,
-                      target);
+       cfg_obj_create(source->file, source->line, source->type, target);
        (*target)->cloned = source->cloned;
        source->type->rep->copy(*target, source);
 }
@@ -185,14 +181,14 @@ 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 = isc_mem_get(to->mctx, sizeof(isc_sockaddr_t));
+       to->value.sockaddr = isc_mem_get(isc_g_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 = isc_mem_get(to->mctx,
+       to->value.sockaddrtls.sockaddr = isc_mem_get(isc_g_mctx,
                                                     sizeof(isc_sockaddr_t));
        memmove(to->value.sockaddrtls.sockaddr,
                from->value.sockaddrtls.sockaddr, sizeof(isc_sockaddr_t));
@@ -200,7 +196,8 @@ copy_sockaddrtls(cfg_obj_t *to, const cfg_obj_t *from) {
        if (from->value.sockaddrtls.tls.base != NULL) {
                size_t len = from->value.sockaddrtls.tls.length;
 
-               to->value.sockaddrtls.tls.base = isc_mem_get(to->mctx, len + 1);
+               to->value.sockaddrtls.tls.base = isc_mem_get(isc_g_mctx,
+                                                            len + 1);
                to->value.sockaddrtls.tls.length = len;
                memmove(to->value.sockaddrtls.tls.base,
                        from->value.sockaddrtls.tls.base, len + 1);
@@ -209,24 +206,24 @@ 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));
+       isc_mem_put(isc_g_mctx, obj->value.netprefix, sizeof(cfg_netprefix_t));
 }
 
 static void
 copy_netprefix(cfg_obj_t *to, const cfg_obj_t *from) {
-       to->value.netprefix = isc_mem_get(to->mctx, sizeof(cfg_netprefix_t));
+       to->value.netprefix = isc_mem_get(isc_g_mctx, sizeof(cfg_netprefix_t));
        memmove(to->value.netprefix, from->value.netprefix,
                sizeof(cfg_netprefix_t));
 }
 
 static void
 free_duration(cfg_obj_t *obj) {
-       isc_mem_put(obj->mctx, obj->value.duration, sizeof(isccfg_duration_t));
+       isc_mem_put(isc_g_mctx, obj->value.duration, sizeof(isccfg_duration_t));
 }
 
 static void
 copy_duration(cfg_obj_t *to, const cfg_obj_t *from) {
-       to->value.duration = isc_mem_get(to->mctx, sizeof(isccfg_duration_t));
+       to->value.duration = isc_mem_get(isc_g_mctx, sizeof(isccfg_duration_t));
        memmove(to->value.duration, from->value.duration,
                sizeof(isccfg_duration_t));
 }
@@ -234,7 +231,7 @@ copy_duration(cfg_obj_t *to, const cfg_obj_t *from) {
 static void
 copy_string(cfg_obj_t *to, const cfg_obj_t *from) {
        to->value.string.length = from->value.string.length;
-       to->value.string.base = isc_mem_get(to->mctx,
+       to->value.string.base = isc_mem_get(isc_g_mctx,
                                            to->value.string.length + 1);
        memmove(to->value.string.base, from->value.string.base,
                to->value.string.length + 1);
@@ -278,7 +275,7 @@ copy_map(cfg_obj_t *to, const cfg_obj_t *from) {
        if (from->value.map.id != NULL) {
                cfg_obj_clone(from->value.map.id, &to->value.map.id);
        }
-       isc_symtab_create(to->mctx, copy_map_destroy, NULL, false,
+       isc_symtab_create(isc_g_mctx, copy_map_destroy, NULL, false,
                          &to->value.map.symtab);
        isc_symtab_foreach(from->value.map.symtab, copy_map_add, to);
 
@@ -295,7 +292,7 @@ copy_list(cfg_obj_t *to, const cfg_obj_t *from) {
        ISC_LIST_INIT(to->value.list);
 
        while (fromelt != NULL) {
-               cfg_listelt_t *toelt = isc_mem_get(to->mctx, sizeof(*toelt));
+               cfg_listelt_t *toelt = isc_mem_get(isc_g_mctx, sizeof(*toelt));
 
                *toelt = (cfg_listelt_t){ .link = ISC_LINK_INITIALIZER };
                cfg_obj_clone(fromelt->obj, &toelt->obj);
@@ -318,7 +315,7 @@ copy_tuple(cfg_obj_t *to, const cfg_obj_t *from) {
                size++;
        }
 
-       to->value.tuple = isc_mem_cget(to->mctx, size, sizeof(cfg_obj_t *));
+       to->value.tuple = isc_mem_cget(isc_g_mctx, size, sizeof(cfg_obj_t *));
 
        for (size_t j = 0; j < size; j++) {
                cfg_obj_clone(from->value.tuple[j], &to->value.tuple[j]);
@@ -488,9 +485,8 @@ cfg_tuple_create(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
                nfields++;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                      type, &obj);
-       obj->value.tuple = isc_mem_cget(pctx->mctx, nfields,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, type, &obj);
+       obj->value.tuple = isc_mem_cget(isc_g_mctx, nfields,
                                        sizeof(cfg_obj_t *));
        for (f = fields, i = 0; f->name != NULL; f++, i++) {
                obj->value.tuple[i] = NULL;
@@ -583,7 +579,8 @@ free_tuple(cfg_obj_t *obj) {
                CLEANUP_OBJ(obj->value.tuple[i]);
                nfields++;
        }
-       isc_mem_cput(obj->mctx, obj->value.tuple, nfields, sizeof(cfg_obj_t *));
+       isc_mem_cput(isc_g_mctx, obj->value.tuple, nfields,
+                    sizeof(cfg_obj_t *));
 }
 
 bool
@@ -688,9 +685,6 @@ parser_create(cfg_parser_t **ret) {
 
        pctx = isc_mem_get(isc_g_mctx, sizeof(*pctx));
 
-       pctx->mctx = NULL;
-       isc_mem_attach(isc_g_mctx, &pctx->mctx);
-
        pctx->lexer = NULL;
        pctx->seen_eof = false;
        pctx->ungotten = false;
@@ -718,9 +712,9 @@ parser_create(cfg_parser_t **ret) {
                                                 ISC_LEXCOMMENT_CPLUSPLUS |
                                                 ISC_LEXCOMMENT_SHELL);
 
-       create_list(isc_g_mctx, cfg_parser_currentfile(pctx), pctx->line,
+       create_list(cfg_parser_currentfile(pctx), pctx->line,
                    &cfg_type_filelist, &pctx->open_files);
-       create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       create_list(cfg_parser_currentfile(pctx), pctx->line,
                    &cfg_type_filelist, &pctx->closed_files);
 
        *ret = pctx;
@@ -742,7 +736,7 @@ parser_destroy(cfg_parser_t **pctxp) {
         */
        CLEANUP_OBJ(pctx->open_files);
        CLEANUP_OBJ(pctx->closed_files);
-       isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
+       isc_mem_put(isc_g_mctx, pctx, sizeof(*pctx));
 }
 
 static isc_result_t
@@ -758,8 +752,8 @@ parser_openfile(cfg_parser_t *pctx, const char *filename) {
                goto cleanup;
        }
 
-       create_listelt(pctx->open_files, &elt);
        cfg_string_create(pctx, filename, &cfg_type_qstring, &stringobj);
+       cfg_listelt_create(&elt);
        elt->obj = stringobj;
        ISC_LIST_APPEND(pctx->open_files->value.list, elt, link);
 
@@ -879,8 +873,8 @@ cfg_parse_void(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
        REQUIRE(pctx != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                      &cfg_type_void, ret);
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, &cfg_type_void,
+                      ret);
        return ISC_R_SUCCESS;
 }
 
@@ -931,7 +925,7 @@ cfg_parse_percentage(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
                return ISC_R_UNEXPECTEDTOKEN;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_percentage, &obj);
        obj->value.uint32 = (uint32_t)percent;
        *ret = obj;
@@ -1003,7 +997,7 @@ cfg_parse_fixedpoint(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
                return ISC_R_UNEXPECTEDTOKEN;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_fixedpoint, &obj);
 
        obj->value.uint32 = strtoul(p, NULL, 10) * 100;
@@ -1070,7 +1064,7 @@ cfg_parse_uint32(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
                return ISC_R_UNEXPECTEDTOKEN;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_uint32, &obj);
 
        obj->value.uint32 = pctx->token.value.as_ulong;
@@ -1298,9 +1292,10 @@ parse_duration(cfg_parser_t *pctx, cfg_obj_t **ret) {
                goto cleanup;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_duration, &obj);
-       obj->value.duration = isc_mem_get(obj->mctx, sizeof(isccfg_duration_t));
+       obj->value.duration = isc_mem_get(isc_g_mctx,
+                                         sizeof(isccfg_duration_t));
        *obj->value.duration = duration;
        *ret = obj;
 
@@ -1350,9 +1345,9 @@ cfg_parse_duration_or_unlimited(cfg_parser_t *pctx,
                duration.iso8601 = false;
                duration.unlimited = true;
 
-               cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
-                              pctx->line, &cfg_type_duration, &obj);
-               obj->value.duration = isc_mem_get(obj->mctx,
+               cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
+                              &cfg_type_duration, &obj);
+               obj->value.duration = isc_mem_get(isc_g_mctx,
                                                  sizeof(isccfg_duration_t));
                *obj->value.duration = duration;
                *ret = obj;
@@ -1404,11 +1399,10 @@ cfg_string_create(cfg_parser_t *pctx, const char *contents,
        cfg_obj_t *obj = NULL;
        int len;
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                      type, &obj);
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, type, &obj);
        len = strlen(contents);
        obj->value.string.length = len;
-       obj->value.string.base = isc_mem_get(pctx->mctx, len + 1);
+       obj->value.string.base = isc_mem_get(isc_g_mctx, len + 1);
        memmove(obj->value.string.base, contents, len);
        obj->value.string.base[len] = '\0';
 
@@ -1680,22 +1674,22 @@ print_sstring(cfg_printer_t *pctx, const cfg_obj_t *obj) {
 
 static void
 free_string(cfg_obj_t *obj) {
-       isc_mem_put(obj->mctx, obj->value.string.base,
+       isc_mem_put(isc_g_mctx, obj->value.string.base,
                    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));
+       isc_mem_put(isc_g_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,
+       isc_mem_put(isc_g_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,
+               isc_mem_put(isc_g_mctx, obj->value.sockaddrtls.tls.base,
                            obj->value.sockaddrtls.tls.length + 1);
        }
 }
@@ -2018,7 +2012,7 @@ cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
                goto bad_boolean;
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_boolean, &obj);
        obj->value.boolean = value;
        *ret = obj;
@@ -2050,28 +2044,26 @@ cfg_type_t cfg_type_boolean = { "boolean",         cfg_parse_boolean,
  */
 
 static void
-create_list(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
-           const cfg_type_t *type, cfg_obj_t **obj) {
-       REQUIRE(mctx != NULL);
+create_list(cfg_obj_t *file, size_t line, const cfg_type_t *type,
+           cfg_obj_t **obj) {
        REQUIRE(type != NULL);
        REQUIRE(obj != NULL && *obj == NULL);
 
-       cfg_obj_create(mctx, file, line, type, obj);
+       cfg_obj_create(file, line, type, obj);
        ISC_LIST_INIT((*obj)->value.list);
 }
 
-static void
-create_listelt(cfg_obj_t *list, cfg_listelt_t **eltp) {
+void
+cfg_listelt_create(cfg_listelt_t **eltp) {
        cfg_listelt_t *elt;
 
-       REQUIRE(VALID_CFGOBJ(list));
-       elt = isc_mem_get(list->mctx, sizeof(*elt));
+       elt = isc_mem_get(isc_g_mctx, sizeof(*elt));
        *elt = (cfg_listelt_t){ .link = ISC_LINK_INITIALIZER };
        *eltp = elt;
 }
 
 static void
-free_listelt(cfg_obj_t *list, cfg_listelt_t **eltp) {
+free_listelt(cfg_listelt_t **eltp) {
        cfg_listelt_t *elt = *eltp;
 
        *eltp = NULL;
@@ -2079,13 +2071,13 @@ free_listelt(cfg_obj_t *list, cfg_listelt_t **eltp) {
        if (elt->obj != NULL) {
                cfg_obj_detach(&elt->obj);
        }
-       isc_mem_put(list->mctx, elt, sizeof(*elt));
+       isc_mem_put(isc_g_mctx, elt, sizeof(*elt));
 }
 
 static void
 free_list(cfg_obj_t *obj) {
        ISC_LIST_FOREACH(obj->value.list, elt, link) {
-               free_listelt(obj, &elt);
+               free_listelt(&elt);
        }
 }
 
@@ -2102,7 +2094,7 @@ cfg_parse_listelt(cfg_parser_t *pctx, cfg_obj_t *list,
 
        RETERR(cfg_parse_obj(pctx, elttype, &value));
 
-       create_listelt(list, &elt);
+       cfg_listelt_create(&elt);
        elt->obj = value;
        *ret = elt;
 
@@ -2120,8 +2112,8 @@ parse_list(cfg_parser_t *pctx, const cfg_type_t *listtype, cfg_obj_t **ret) {
        isc_result_t result;
        cfg_listelt_t *elt = NULL;
 
-       create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                   listtype, &listobj);
+       create_list(cfg_parser_currentfile(pctx), pctx->line, listtype,
+                   &listobj);
 
        for (;;) {
                CHECK(cfg_peektoken(pctx, 0));
@@ -2140,7 +2132,7 @@ parse_list(cfg_parser_t *pctx, const cfg_type_t *listtype, cfg_obj_t **ret) {
 
 cleanup:
        if (elt != NULL) {
-               free_listelt(listobj, &elt);
+               free_listelt(&elt);
        }
        CLEANUP_OBJ(listobj);
        return result;
@@ -2219,8 +2211,8 @@ cfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *listtype,
 
        listof = listtype->of;
 
-       create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                   listtype, &listobj);
+       create_list(cfg_parser_currentfile(pctx), pctx->line, listtype,
+                   &listobj);
 
        for (;;) {
                cfg_listelt_t *elt = NULL;
@@ -2285,7 +2277,7 @@ void
 cfg_list_unlink(cfg_obj_t *list, cfg_listelt_t *elt) {
        REQUIRE(VALID_CFGOBJ(list));
        ISC_LIST_UNLINK(list->value.list, elt, link);
-       free_listelt(list, &elt);
+       free_listelt(&elt);
 }
 
 /*
@@ -2502,9 +2494,8 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
                        cfg_obj_t *listobj = NULL;
                        cfg_listelt_t *elt = NULL;
 
-                       create_list(pctx->mctx, cfg_parser_currentfile(pctx),
-                                   pctx->line, &cfg_type_implicitlist,
-                                   &listobj);
+                       create_list(cfg_parser_currentfile(pctx), pctx->line,
+                                   &cfg_type_implicitlist, &listobj);
                        symval.as_pointer = listobj;
                        result = isc_symtab_define_and_return(
                                obj->value.map.symtab, clause->name,
@@ -2978,7 +2969,7 @@ parse_token(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
        isc_result_t result;
        isc_region_t r;
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_token, &obj);
        CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
        if (pctx->token.type == isc_tokentype_eof) {
@@ -2988,7 +2979,7 @@ parse_token(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
 
        isc_lex_getlasttokentext(pctx->lexer, &pctx->token, &r);
 
-       obj->value.string.base = isc_mem_get(pctx->mctx, r.length + 1);
+       obj->value.string.base = isc_mem_get(isc_g_mctx, r.length + 1);
        obj->value.string.length = r.length;
        memmove(obj->value.string.base, r.base, r.length);
        obj->value.string.base[r.length] = '\0';
@@ -2997,7 +2988,7 @@ parse_token(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
 
 cleanup:
        if (obj != NULL) {
-               isc_mem_put(pctx->mctx, obj, sizeof(*obj));
+               isc_mem_put(isc_g_mctx, obj, sizeof(*obj));
        }
        return result;
 }
@@ -3017,8 +3008,7 @@ parse_unsupported(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        isc_result_t result;
        int braces = 0;
 
-       create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line, type,
-                   &listobj);
+       create_list(cfg_parser_currentfile(pctx), pctx->line, type, &listobj);
 
        for (;;) {
                cfg_listelt_t *elt = NULL;
@@ -3244,9 +3234,8 @@ parse_netaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        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);
-       obj->value.sockaddr = isc_mem_get(obj->mctx, sizeof(isc_sockaddr_t));
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, type, &obj);
+       obj->value.sockaddr = isc_mem_get(isc_g_mctx, sizeof(isc_sockaddr_t));
        isc_sockaddr_fromnetaddr(obj->value.sockaddr, &netaddr, 0);
        *ret = obj;
        return ISC_R_SUCCESS;
@@ -3372,9 +3361,9 @@ cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type ISC_ATTR_UNUSED,
                }
                prefixlen = addrlen;
        }
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line,
                       &cfg_type_netprefix, &obj);
-       obj->value.netprefix = isc_mem_get(obj->mctx, sizeof(cfg_netprefix_t));
+       obj->value.netprefix = isc_mem_get(isc_g_mctx, sizeof(cfg_netprefix_t));
        obj->value.netprefix->address = netaddr;
        obj->value.netprefix->prefixlen = prefixlen;
        *ret = obj;
@@ -3469,7 +3458,7 @@ parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type, int flags,
                                CHECK(cfg_getstringtoken(pctx));
 
                                isc_textregion_t tok = TOKEN_REGION(pctx);
-                               copy_textregion(pctx->mctx, &tls, tok);
+                               copy_textregion(isc_g_mctx, &tls, tok);
 
                                ++have_tls;
                        } else {
@@ -3499,12 +3488,11 @@ parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type, int flags,
                CLEANUP(ISC_R_UNEXPECTEDTOKEN);
        }
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                      type, &obj);
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, type, &obj);
        if (have_tls == 1) {
                obj->value.sockaddrtls.tls = tls;
        }
-       obj->value.sockaddrtls.sockaddr = isc_mem_get(obj->mctx,
+       obj->value.sockaddrtls.sockaddr = isc_mem_get(isc_g_mctx,
                                                      sizeof(isc_sockaddr_t));
        isc_sockaddr_fromnetaddr(obj->value.sockaddrtls.sockaddr, &netaddr,
                                 port);
@@ -3513,7 +3501,7 @@ parse_sockaddrsub(cfg_parser_t *pctx, const cfg_type_t *type, int flags,
 
 cleanup:
        if (tls.base != NULL) {
-               isc_mem_put(pctx->mctx, tls.base, tls.length + 1);
+               isc_mem_put(isc_g_mctx, tls.base, tls.length + 1);
        }
        CLEANUP_OBJ(obj);
        return result;
@@ -3891,19 +3879,18 @@ cfg_obj_line(const cfg_obj_t *obj) {
 }
 
 void
-cfg_obj_create(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
-              const cfg_type_t *type, cfg_obj_t **ret) {
+cfg_obj_create(cfg_obj_t *file, size_t line, const cfg_type_t *type,
+              cfg_obj_t **ret) {
        cfg_obj_t *obj;
 
-       REQUIRE(mctx != NULL);
        REQUIRE(type != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
-       obj = isc_mem_get(mctx, sizeof(cfg_obj_t));
+       INSIST(isc_g_mctx != NULL);
+       obj = isc_mem_get(isc_g_mctx, sizeof(cfg_obj_t));
        *obj = (cfg_obj_t){ .magic = CFGOBJ_MAGIC, .type = type, .line = line };
 
        isc_refcount_init(&obj->references, 1);
-       isc_mem_attach(mctx, &obj->mctx);
        if (file != NULL) {
                cfg_obj_attach(file, &obj->file);
        }
@@ -3927,9 +3914,8 @@ create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        isc_symtab_t *symtab = NULL;
        cfg_obj_t *obj = NULL;
 
-       cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
-                      type, &obj);
-       isc_symtab_create(pctx->mctx, map_symtabitem_destroy, pctx, false,
+       cfg_obj_create(cfg_parser_currentfile(pctx), pctx->line, type, &obj);
+       isc_symtab_create(isc_g_mctx, map_symtabitem_destroy, pctx, false,
                          &symtab);
        obj->value.map.symtab = symtab;
        obj->value.map.id = NULL;
@@ -3963,7 +3949,7 @@ destroy_cfgobj(cfg_obj_t *obj) {
        obj->magic = 0;
 
        isc_refcount_destroy(&obj->references);
-       isc_mem_putanddetach(&obj->mctx, obj, sizeof(cfg_obj_t));
+       isc_mem_put(isc_g_mctx, obj, sizeof(*obj));
 }
 
 ISC_REFCOUNT_IMPL(cfg_obj, destroy_cfgobj);
@@ -4016,9 +4002,9 @@ map_define(cfg_obj_t *mapobj, cfg_obj_t *obj, const cfg_clausedef_t *clause) {
                        cfg_obj_t *destobj = NULL;
                        cfg_listelt_t *elt = NULL;
 
-                       create_list(mapobj->mctx, obj->file, obj->line,
+                       create_list(obj->file, obj->line,
                                    &cfg_type_implicitlist, &destobj);
-                       create_listelt(destobj, &elt);
+                       cfg_listelt_create(&elt);
                        cfg_obj_attach(obj, &elt->obj);
                        ISC_LIST_APPEND(destobj->value.list, elt, link);
                        symval.as_pointer = destobj;
@@ -4037,7 +4023,7 @@ map_define(cfg_obj_t *mapobj, cfg_obj_t *obj, const cfg_clausedef_t *clause) {
                INSIST(result == ISC_R_SUCCESS);
 
                if (destobj->type == &cfg_type_implicitlist) {
-                       create_listelt(destobj, &elt);
+                       cfg_listelt_create(&elt);
                        cfg_obj_attach(obj, &elt->obj);
                        ISC_LIST_APPEND(destobj->value.list, elt, link);
                } else {
@@ -4119,7 +4105,8 @@ cfg_list_addclone(cfg_obj_t *dst, const cfg_obj_t *src, bool prepend) {
 
        srcelt = cfg_list_first(src);
        while (srcelt != NULL) {
-               cfg_listelt_t *dstelt = isc_mem_get(dst->mctx, sizeof(*dstelt));
+               cfg_listelt_t *dstelt = isc_mem_get(isc_g_mctx,
+                                                   sizeof(*dstelt));
 
                *dstelt = (cfg_listelt_t){ .link = ISC_LINK_INITIALIZER };
                cfg_obj_clone(srcelt->obj, &dstelt->obj);