]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3520. [bug] 'mctx' was not being referenced counted in some places
authorMark Andrews <marka@isc.org>
Fri, 8 Mar 2013 03:38:03 +0000 (14:38 +1100)
committerMark Andrews <marka@isc.org>
Fri, 8 Mar 2013 03:38:03 +0000 (14:38 +1100)
                        where it should have been.  [RT #32794]

CHANGES
bin/named/controlconf.c
bin/named/interfacemgr.c
lib/dns/ssu.c
lib/dns/view.c
lib/dns/xfrin.c
lib/isc/symtab.c
lib/isc/taskpool.c
lib/isccfg/parser.c

diff --git a/CHANGES b/CHANGES
index 3ea845b2cec8cf07e23ff3cdd7047a7cbd6646d9..4145fdeba07803d1891d3964f343c9153a2d4db7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3520.  [bug]           'mctx' was not being referenced counted in some places
+                       where it should have been.  [RT #32794]
+
 3519.  [func]          Full replay protection via four-way handshake is
                        now mandatory for rndc clients. Very old versions
                        of rndc will no longer work. [RT #32798]
index 2a5a55435a3aedd7794dd4d29c4153962606e463..7297321b51a6f86056d01ef48de9497174f7610a 100644 (file)
@@ -149,7 +149,7 @@ free_listener(controllistener_t *listener) {
        if (listener->acl != NULL)
                dns_acl_detach(&listener->acl);
 
-       isc_mem_put(listener->mctx, listener, sizeof(*listener));
+       isc_mem_putanddetach(&listener->mctx, listener, sizeof(*listener));
 }
 
 static void
@@ -1069,8 +1069,9 @@ add_listener(ns_controls_t *cp, controllistener_t **listenerp,
                result = ISC_R_NOMEMORY;
 
        if (result == ISC_R_SUCCESS) {
+               listener->mctx = NULL;
+               isc_mem_attach(mctx, &listener->mctx);
                listener->controls = cp;
-               listener->mctx = mctx;
                listener->task = cp->server->task;
                listener->address = *addr;
                listener->sock = NULL;
index 5215307e5abff0364f3759d5c669558f74ee7b4d..268e47d893911e410acfe7d5525d273f6aaad236 100644 (file)
@@ -80,11 +80,13 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
        if (mgr == NULL)
                return (ISC_R_NOMEMORY);
 
+       mgr->mctx = NULL;
+       isc_mem_attach(mctx, &mgr->mctx);
+
        result = isc_mutex_init(&mgr->lock);
        if (result != ISC_R_SUCCESS)
                goto cleanup_mem;
 
-       mgr->mctx = mctx;
        mgr->taskmgr = taskmgr;
        mgr->socketmgr = socketmgr;
        mgr->dispatchmgr = dispatchmgr;
@@ -119,7 +121,7 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
        ns_listenlist_detach(&mgr->listenon4);
        ns_listenlist_detach(&mgr->listenon6);
  cleanup_mem:
-       isc_mem_put(mctx, mgr, sizeof(*mgr));
+       isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
        return (result);
 }
 
@@ -132,7 +134,7 @@ ns_interfacemgr_destroy(ns_interfacemgr_t *mgr) {
        clearlistenon(mgr);
        DESTROYLOCK(&mgr->lock);
        mgr->magic = 0;
-       isc_mem_put(mgr->mctx, mgr, sizeof(*mgr));
+       isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
 }
 
 dns_aclenv_t *
index 83aa679361055470da7eadd345fea96cd83ab462..189c597eb6d455d2d303699c357c2c20ba897c08 100644 (file)
@@ -82,7 +82,8 @@ dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **tablep) {
                return (result);
        }
        table->references = 1;
-       table->mctx = mctx;
+       table->mctx = NULL;
+       isc_mem_attach(mctx, &table->mctx);
        ISC_LIST_INIT(table->rules);
        table->magic = SSUTABLEMAGIC;
        *tablep = table;
@@ -115,7 +116,7 @@ destroy(dns_ssutable_t *table) {
        }
        DESTROYLOCK(&table->lock);
        table->magic = 0;
-       isc_mem_put(mctx, table, sizeof(dns_ssutable_t));
+       isc_mem_putanddetach(&table->mctx, table, sizeof(dns_ssutable_t));
 }
 
 void
index ad773af96b18b305b7e5ed3e0dbb3e9363de3e73..dff4ae7323d764988061c324beee5f312c834eab 100644 (file)
@@ -88,6 +88,9 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
        view = isc_mem_get(mctx, sizeof(*view));
        if (view == NULL)
                return (ISC_R_NOMEMORY);
+
+       view->mctx = NULL;
+       isc_mem_attach(mctx, &view->mctx);
        view->name = isc_mem_strdup(mctx, name);
        if (view->name == NULL) {
                result = ISC_R_NOMEMORY;
@@ -128,7 +131,6 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
        view->resolver = NULL;
        view->adb = NULL;
        view->requestmgr = NULL;
-       view->mctx = mctx;
        view->rdclass = rdclass;
        view->frozen = ISC_FALSE;
        view->task = NULL;
@@ -265,7 +267,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
        isc_mem_free(mctx, view->name);
 
  cleanup_view:
-       isc_mem_put(mctx, view, sizeof(*view));
+       isc_mem_putanddetach(&view->mctx, view, sizeof(*view));
 
        return (result);
 }
@@ -464,7 +466,7 @@ destroy(dns_view_t *view) {
        DESTROYLOCK(&view->lock);
        isc_refcount_destroy(&view->references);
        isc_mem_free(view->mctx, view->name);
-       isc_mem_put(view->mctx, view, sizeof(*view));
+       isc_mem_putanddetach(&view->mctx, view, sizeof(*view));
 }
 
 /*
index 6ff40c7643062104e66e537d4e37e2bdd32db76d..0c4c2e9252fcbef5df1b08853f00cadf10898a53 100644 (file)
@@ -778,7 +778,8 @@ xfrin_create(isc_mem_t *mctx,
        xfr = isc_mem_get(mctx, sizeof(*xfr));
        if (xfr == NULL)
                return (ISC_R_NOMEMORY);
-       xfr->mctx = mctx;
+       xfr->mctx = NULL;
+       isc_mem_attach(mctx, &xfr->mctx);
        xfr->refcount = 0;
        xfr->zone = NULL;
        dns_zone_iattach(zone, &xfr->zone);
@@ -873,7 +874,7 @@ xfrin_create(isc_mem_t *mctx,
                dns_db_detach(&xfr->db);
        isc_task_detach(&xfr->task);
        dns_zone_idetach(&xfr->zone);
-       isc_mem_put(mctx, xfr, sizeof(*xfr));
+       isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr));
 
        return (result);
 }
@@ -1497,7 +1498,7 @@ maybe_free(dns_xfrin_ctx_t *xfr) {
        if (xfr->zone != NULL)
                dns_zone_idetach(&xfr->zone);
 
-       isc_mem_put(xfr->mctx, xfr, sizeof(*xfr));
+       isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr));
 }
 
 /*
index d4c1dccf0ad90fc6c38f4946670a8733a8853fb0..8cebb978403c38d857306ac46ecd9303c94b179b 100644 (file)
@@ -71,15 +71,17 @@ isc_symtab_create(isc_mem_t *mctx, unsigned int size,
        symtab = (isc_symtab_t *)isc_mem_get(mctx, sizeof(*symtab));
        if (symtab == NULL)
                return (ISC_R_NOMEMORY);
+
+       symtab->mctx = NULL;
+       isc_mem_attach(mctx, &symtab->mctx);
        symtab->table = (eltlist_t *)isc_mem_get(mctx,
                                                 size * sizeof(eltlist_t));
        if (symtab->table == NULL) {
-               isc_mem_put(mctx, symtab, sizeof(*symtab));
+               isc_mem_putanddetach(&symtab->mctx, symtab, sizeof(*symtab));
                return (ISC_R_NOMEMORY);
        }
        for (i = 0; i < size; i++)
                INIT_LIST(symtab->table[i]);
-       symtab->mctx = mctx;
        symtab->size = size;
        symtab->count = 0;
        symtab->maxload = size * 3 / 4;
@@ -117,7 +119,7 @@ isc_symtab_destroy(isc_symtab_t **symtabp) {
        isc_mem_put(symtab->mctx, symtab->table,
                    symtab->size * sizeof(eltlist_t));
        symtab->magic = 0;
-       isc_mem_put(symtab->mctx, symtab, sizeof(*symtab));
+       isc_mem_putanddetach(&symtab->mctx, symtab, sizeof(*symtab));
 
        *symtabp = NULL;
 }
index 25d951682889d537a40076e73edaa4940799168f..8d6cdaa0e05b257cd49f0df91063b8f1ec5c2dce 100644 (file)
@@ -52,13 +52,15 @@ alloc_pool(isc_taskmgr_t *tmgr, isc_mem_t *mctx, unsigned int ntasks,
        pool = isc_mem_get(mctx, sizeof(*pool));
        if (pool == NULL)
                return (ISC_R_NOMEMORY);
-       pool->mctx = mctx;
+
+       pool->mctx = NULL;
+       isc_mem_attach(mctx, &pool->mctx);
        pool->ntasks = ntasks;
        pool->quantum = quantum;
        pool->tmgr = tmgr;
        pool->tasks = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *));
        if (pool->tasks == NULL) {
-               isc_mem_put(mctx, pool, sizeof(*pool));
+               isc_mem_putanddetach(&pool->mctx, pool, sizeof(*pool));
                return (ISC_R_NOMEMORY);
        }
        for (i = 0; i < ntasks; i++)
@@ -168,7 +170,7 @@ isc_taskpool_destroy(isc_taskpool_t **poolp) {
        }
        isc_mem_put(pool->mctx, pool->tasks,
                    pool->ntasks * sizeof(isc_task_t *));
-       isc_mem_put(pool->mctx, pool, sizeof(*pool));
+       isc_mem_putanddetach(&pool->mctx, pool, sizeof(*pool));
        *poolp = NULL;
 }
 
index 7afdf1dd6d88ccd824813c1b5c90f1aed1e04ad4..de0fa31ee2288adb929b82bdd1479a6cc66765e8 100644 (file)
@@ -387,13 +387,15 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
        if (pctx == NULL)
                return (ISC_R_NOMEMORY);
 
+       pctx->mctx = NULL;
+       isc_mem_attach(mctx, &pctx->mctx);
+
        result = isc_refcount_init(&pctx->references, 1);
        if (result != ISC_R_SUCCESS) {
-               isc_mem_put(mctx, pctx, sizeof(*pctx));
+               isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
                return (result);
        }
 
-       pctx->mctx = mctx;
        pctx->lctx = lctx;
        pctx->lexer = NULL;
        pctx->seen_eof = ISC_FALSE;
@@ -434,7 +436,7 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
                isc_lex_destroy(&pctx->lexer);
        CLEANUP_OBJ(pctx->open_files);
        CLEANUP_OBJ(pctx->closed_files);
-       isc_mem_put(mctx, pctx, sizeof(*pctx));
+       isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
        return (result);
 }
 
@@ -555,7 +557,7 @@ cfg_parser_destroy(cfg_parser_t **pctxp) {
                 */
                CLEANUP_OBJ(pctx->open_files);
                CLEANUP_OBJ(pctx->closed_files);
-               isc_mem_put(pctx->mctx, pctx, sizeof(*pctx));
+               isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
        }
        *pctxp = NULL;
 }