]> 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:42:17 +0000 (14:42 +1100)
                        where it should have been.  [RT #32794]
(cherry picked from commit 3a0da183bb40bd120698102b20b61ef12665c09b)

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 f93a327500885f766f771b662e9f55d5754ff2f7..fdc4836df897e4580fe46bedf6d6a107be973adf 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]
+
        --- 9.8.5b2 released ---
 
 3517.  [bug]           Reorder destruction to avoid shutdown race. [RT #32777]
index daf00d04ed658fb9533a96fa97920cf51f4fbe67..0f6febde2a8bc09cc1fbcf080ea758d3f350562b 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
@@ -1066,8 +1066,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 d194d2b877cf196337f0581686ac0aa53ed1c97b..825a872cf39020780416b76f7fd1424e493986e7 100644 (file)
@@ -79,11 +79,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;
@@ -115,7 +117,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);
 }
 
@@ -128,7 +130,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 c0f6cb38985ea31bb8085defe59e3988cf9258ff..c1c47ef68cc547ffc93eddd2915fb3490f05d9b9 100644 (file)
@@ -86,6 +86,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;
@@ -125,7 +128,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;
@@ -260,7 +262,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);
 }
@@ -439,7 +441,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 f000d89aa244c9a8349afb5526fd5b01f517fd2b..e39a8b0b7c8ef62e7f20f462ac4f23c41deda93b 100644 (file)
@@ -782,7 +782,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);
@@ -877,7 +878,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);
 }
@@ -1492,7 +1493,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 936732c0e955b5b797378dca96d27fc79ba76b48..cffff7a552a7861d28a5f27347169242c154b17d 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++)
@@ -169,7 +171,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;
 }