]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Always check the return from isc_refcount_decrement.
authorMark Andrews <marka@isc.org>
Thu, 5 Dec 2019 02:29:45 +0000 (13:29 +1100)
committerMark Andrews <marka@isc.org>
Fri, 31 Jul 2020 00:15:44 +0000 (10:15 +1000)
Created isc_refcount_decrement_expect macro to test conditionally
the return value to ensure it is in expected range.  Converted
unchecked isc_refcount_decrement to use isc_refcount_decrement_expect.
Converted INSIST(isc_refcount_decrement()...) to isc_refcount_decrement_expect.

16 files changed:
bin/named/server.c
lib/dns/cache.c
lib/dns/client.c
lib/dns/rbtdb.c
lib/dns/resolver.c
lib/dns/rpz.c
lib/dns/sdlz.c
lib/dns/tsig.c
lib/dns/view.c
lib/dns/zone.c
lib/dns/zt.c
lib/isc/httpd.c
lib/isc/include/isc/refcount.h
lib/isc/mem.c
lib/isc/unix/socket.c
lib/isc/win32/socket.c

index 0d9639717ff80953a60d634f1975d22fff0f4d8d..81cf4b592f917e2d77f2f15885d72f6b2249b95d 100644 (file)
@@ -9664,7 +9664,7 @@ load_zones(named_server_t *server, bool init, bool reconfig) {
                isc_refcount_increment(&zl->refs);
                result = dns_view_asyncload(view, reconfig, view_loaded, zl);
                if (result != ISC_R_SUCCESS) {
-                       (void)isc_refcount_decrement(&zl->refs);
+                       isc_refcount_decrement1(&zl->refs);
                        goto cleanup;
                }
        }
index a156f80e83ae61e2f6b4f3a57586721a2ae64ce1..d32e903d088724dd8564a74dca7588c053aaa7bd 100644 (file)
@@ -555,7 +555,7 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
                result = isc_task_onshutdown(cleaner->task,
                                             cleaner_shutdown_action, cache);
                if (result != ISC_R_SUCCESS) {
-                       isc_refcount_decrement(&cleaner->cache->live_tasks);
+                       isc_refcount_decrement0(&cleaner->cache->live_tasks);
                        UNEXPECTED_ERROR(__FILE__, __LINE__,
                                         "cache cleaner: "
                                         "isc_task_onshutdown() failed: %s",
@@ -1020,7 +1020,7 @@ cleaner_shutdown_action(isc_task_t *task, isc_event_t *event) {
        /* Make sure we don't reschedule anymore. */
        (void)isc_task_purge(task, NULL, DNS_EVENT_CACHECLEAN, NULL);
 
-       INSIST(isc_refcount_decrement(&cache->live_tasks) == 1);
+       isc_refcount_decrementz(&cache->live_tasks);
 
        cache_free(cache);
 }
index 11ecd0530083bdc427223059eba5f041111b08a9..b48eb0c9bead45ee2d0a45d94e1d7f2b9935c72c 100644 (file)
@@ -582,7 +582,7 @@ dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
        return (ISC_R_SUCCESS);
 
 cleanup_references:
-       isc_refcount_decrement(&client->references);
+       isc_refcount_decrementz(&client->references);
        isc_refcount_destroy(&client->references);
 cleanup_dispatchmgr:
        if (dispatchv4 != NULL) {
@@ -1787,7 +1787,7 @@ dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage,
                return (ISC_R_SUCCESS);
        }
 
-       isc_refcount_decrement(&client->references);
+       isc_refcount_decrement1(&client->references);
 
        LOCK(&client->lock);
        ISC_LIST_UNLINK(client->reqctxs, ctx, link);
@@ -2946,7 +2946,7 @@ dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass,
                return (result);
        }
 
-       isc_refcount_decrement(&client->references);
+       isc_refcount_decrement1(&client->references);
        *transp = NULL;
 
 fail:
index 6d785869c5961eff11773b2588c360ae1df29b4e..0e26425a301c850371cf0b3a5304c7074ba3a6e5 100644 (file)
@@ -1046,9 +1046,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb, bool log, isc_event_t *event) {
        REQUIRE(rbtdb->future_version == NULL);
 
        if (rbtdb->current_version != NULL) {
-               INSIST(isc_refcount_decrement(
-                              &rbtdb->current_version->references) == 1);
-
+               isc_refcount_decrementz(&rbtdb->current_version->references);
                UNLINK(rbtdb->open_versions, rbtdb->current_version, link);
                isc_rwlock_destroy(&rbtdb->current_version->glue_rwlock);
                isc_refcount_destroy(&rbtdb->current_version->references);
@@ -8703,7 +8701,7 @@ dns_rbtdb_create(isc_mem_t *mctx, const dns_name_t *origin, dns_dbtype_t type,
        rbtdb->next_serial = 2;
        rbtdb->current_version = allocate_version(mctx, 1, 1, false);
        if (rbtdb->current_version == NULL) {
-               isc_refcount_decrement(&rbtdb->references);
+               isc_refcount_decrementz(&rbtdb->references);
                free_rbtdb(rbtdb, false, NULL);
                return (ISC_R_NOMEMORY);
        }
@@ -8724,7 +8722,7 @@ dns_rbtdb_create(isc_mem_t *mctx, const dns_name_t *origin, dns_dbtype_t type,
                isc_mem_put(mctx, rbtdb->current_version,
                            sizeof(*rbtdb->current_version));
                rbtdb->current_version = NULL;
-               isc_refcount_decrement(&rbtdb->references);
+               isc_refcount_decrementz(&rbtdb->references);
                free_rbtdb(rbtdb, false, NULL);
                return (result);
        }
index 893eb340d2142f5d305e44feb168d26b94f78eee..21f8d96e0e51746cc5f877ebeee9fe27c1f90f22 100644 (file)
@@ -4487,7 +4487,7 @@ fctx_unlink(fetchctx_t *fctx) {
 
        ISC_LIST_UNLINK(res->buckets[bucketnum].fctxs, fctx, link);
 
-       REQUIRE(atomic_fetch_sub_release(&res->nfctx, 1) > 0);
+       INSIST(atomic_fetch_sub_release(&res->nfctx, 1) > 0);
 
        dec_stats(res, dns_resstatscounter_nfetch);
 
@@ -5185,7 +5185,7 @@ fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type,
 
        ISC_LIST_APPEND(res->buckets[bucketnum].fctxs, fctx, link);
 
-       REQUIRE(atomic_fetch_add_relaxed(&res->nfctx, 1) < UINT32_MAX);
+       INSIST(atomic_fetch_add_relaxed(&res->nfctx, 1) < UINT32_MAX);
 
        inc_stats(res, dns_resstatscounter_nfetch);
 
index bdda8d266b871344ecdd3cdaba7250d0f4083f2a..a99c427ada9245de8d4a60a20dc4b52f82c053cb 100644 (file)
@@ -1502,9 +1502,9 @@ cleanup_task:
        dns_rbt_destroy(&zones->rbt);
 
 cleanup_rbt:
-       isc_refcount_decrement(&zones->irefs);
+       isc_refcount_decrementz(&zones->irefs);
        isc_refcount_destroy(&zones->irefs);
-       isc_refcount_decrement(&zones->refs);
+       isc_refcount_decrementz(&zones->refs);
        isc_refcount_destroy(&zones->refs);
 
        isc_mutex_destroy(&zones->maint_lock);
@@ -1587,7 +1587,7 @@ cleanup_ht:
        isc_timer_detach(&zone->updatetimer);
 
 cleanup_timer:
-       isc_refcount_decrement(&zone->refs);
+       isc_refcount_decrementz(&zone->refs);
        isc_refcount_destroy(&zone->refs);
 
        isc_mem_put(rpzs->mctx, zone, sizeof(*zone));
index bd712ab36eb22c0952d2e91a12514d88ecd090b3..2271de67ea098581d3415fa372da41e77e3962ab 100644 (file)
@@ -638,7 +638,7 @@ getnodedata(dns_db_t *db, const dns_name_t *name, bool create,
        }
 
        if (result != ISC_R_SUCCESS) {
-               isc_refcount_decrement(&node->references);
+               isc_refcount_decrementz(&node->references);
                destroynode(node);
                return (result);
        }
@@ -650,7 +650,7 @@ getnodedata(dns_db_t *db, const dns_name_t *name, bool create,
                                      sdlz->dbdata, node);
                MAYBE_UNLOCK(sdlz->dlzimp);
                if (result != ISC_R_SUCCESS && result != ISC_R_NOTIMPLEMENTED) {
-                       isc_refcount_decrement(&node->references);
+                       isc_refcount_decrementz(&node->references);
                        destroynode(node);
                        return (result);
                }
@@ -1299,7 +1299,7 @@ dbiterator_destroy(dns_dbiterator_t **iteratorp) {
                dns_sdlznode_t *node;
                node = ISC_LIST_HEAD(sdlziter->nodelist);
                ISC_LIST_UNLINK(sdlziter->nodelist, node, link);
-               isc_refcount_decrement(&node->references);
+               isc_refcount_decrementz(&node->references);
                destroynode(node);
        }
 
index 591dfca77a62b6e8b087ebf3ca28a268f0c7a192..4845a8a511b2da58be5bda7aa6f20a9bad9e9714 100644 (file)
@@ -349,7 +349,7 @@ dns_tsigkey_createfromkey(const dns_name_t *name, const dns_name_t *algorithm,
 cleanup_refs:
        tkey->magic = 0;
        while (refs-- > 0) {
-               isc_refcount_decrement(&tkey->refs);
+               isc_refcount_decrement0(&tkey->refs);
        }
        isc_refcount_destroy(&tkey->refs);
 
index e0b969b8d88583e44f08caab58c4102226eaaa58..d7b9f149c3bdb54a1ed4238041b92644593ff4c1 100644 (file)
@@ -314,10 +314,10 @@ cleanup_dynkeys:
        }
 
 cleanup_weakrefs:
-       isc_refcount_decrement(&view->weakrefs);
+       isc_refcount_decrementz(&view->weakrefs);
        isc_refcount_destroy(&view->weakrefs);
 
-       isc_refcount_decrement(&view->references);
+       isc_refcount_decrementz(&view->references);
        isc_refcount_destroy(&view->references);
 
        if (view->fwdtable != NULL) {
index 2cd966d28b7347aee85805423d4d93be13a48c14..d6310878a89647d76bda1b554859578dc89bc96f 100644 (file)
@@ -1146,7 +1146,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
        return (ISC_R_SUCCESS);
 
 free_refs:
-       isc_refcount_decrement(&zone->erefs);
+       isc_refcount_decrement0(&zone->erefs);
        isc_refcount_destroy(&zone->erefs);
        isc_refcount_destroy(&zone->irefs);
 
index 53e491be943f7cef87650ef574f19fe2ca3acc3a..acceb9cc29e10440dc663cd91efee183edf680e4 100644 (file)
@@ -375,8 +375,8 @@ asyncload(dns_zone_t *zone, void *zt_) {
                 * Caller is holding a reference to zt->loads_pending
                 * and zt->references so these can't decrement to zero.
                 */
-               INSIST(isc_refcount_decrement(&zt->loads_pending) > 1);
-               INSIST(isc_refcount_decrement(&zt->references) > 1);
+               isc_refcount_decrement1(&zt->references);
+               isc_refcount_decrement1(&zt->loads_pending);
        }
        return (ISC_R_SUCCESS);
 }
index 1bb5ec7dac0afa53ea2c928506278d0b38d02861..688c873daa4f0ea8c4128d6c4154aebb5606af75 100644 (file)
@@ -236,7 +236,7 @@ isc_httpdmgr_create(isc_nm_t *nm, isc_mem_t *mctx, isc_sockaddr_t *addr,
 
 cleanup:
        httpdmgr->magic = 0;
-       isc_refcount_decrement(&httpdmgr->references);
+       isc_refcount_decrementz(&httpdmgr->references);
        isc_refcount_destroy(&httpdmgr->references);
        isc_mem_detach(&httpdmgr->mctx);
        isc_mutex_destroy(&httpdmgr->lock);
index 42a0c51ca233734baebcbc7be6e97e02e233efd8..74543d471f7db71d3409d1b4abc572b04f406f00 100644 (file)
@@ -133,4 +133,22 @@ isc_refcount_decrement(isc_refcount_t *target) {
        })
 #endif /* _MSC_VER */
 
+#define isc_refcount_decrementz(target)                               \
+       do {                                                          \
+               uint_fast32_t _refs = isc_refcount_decrement(target); \
+               ISC_INSIST(_refs == 1);                               \
+       } while (0)
+
+#define isc_refcount_decrement1(target)                               \
+       do {                                                          \
+               uint_fast32_t _refs = isc_refcount_decrement(target); \
+               ISC_INSIST(_refs > 1);                                \
+       } while (0)
+
+#define isc_refcount_decrement0(target)                               \
+       do {                                                          \
+               uint_fast32_t _refs = isc_refcount_decrement(target); \
+               ISC_INSIST(_refs > 0);                                \
+       } while (0)
+
 ISC_LANG_ENDDECLS
index ba58d02d1566d4dbc3e93ee571421de866f44c9a..2c8d594e365fd39b519721ad851f35f9ce8ad59c 100644 (file)
@@ -1015,7 +1015,7 @@ isc_mem_destroy(isc_mem_t **ctxp) {
                print_active(ctx, stderr);
        }
 #else  /* if ISC_MEM_TRACKLINES */
-       isc_refcount_decrement(&ctx->references);
+       isc_refcount_decrementz(&ctx->references);
 #endif /* if ISC_MEM_TRACKLINES */
        isc_refcount_destroy(&ctx->references);
        destroy(ctx);
index e6952bc9aff9a7362ec3eeeaa1da4bd03eff3f75..043b33e34dfd2eab58313754b31999085b04927b 100644 (file)
@@ -2999,7 +2999,7 @@ internal_accept(isc__socket_t *sock) {
                inc_stats(manager->stats, sock->statsindex[STATID_ACCEPT]);
        } else {
                inc_stats(manager->stats, sock->statsindex[STATID_ACCEPTFAIL]);
-               (void)isc_refcount_decrement(&NEWCONNSOCK(dev)->references);
+               isc_refcount_decrementz(&NEWCONNSOCK(dev)->references);
                free_socket((isc__socket_t **)&dev->newsocket);
        }
 
@@ -5081,7 +5081,7 @@ isc_socket_cancel(isc_socket_t *sock0, isc_task_t *task, unsigned int how) {
                                ISC_LIST_UNLINK(sock->accept_list, dev,
                                                ev_link);
 
-                               (void)isc_refcount_decrement(
+                               isc_refcount_decrementz(
                                        &NEWCONNSOCK(dev)->references);
                                free_socket((isc__socket_t **)&dev->newsocket);
 
index af55eb843a56ac74c504442abbd71ab30966e0e6..917927fc7307d585c128a39d9c6fd832a6f5454d 100644 (file)
@@ -2488,7 +2488,7 @@ SocketIoThread(LPVOID ThreadContext) {
                                        closesocket(lpo->adev->newsocket->fd);
                                        lpo->adev->newsocket->fd =
                                                INVALID_SOCKET;
-                                       isc_refcount_decrement(
+                                       isc_refcount_decrementz(
                                                &lpo->adev->newsocket
                                                         ->references);
                                        free_socket(&lpo->adev->newsocket,
@@ -3501,7 +3501,7 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
                        next = ISC_LIST_NEXT(dev, ev_link);
 
                        if ((task == NULL) || (task == current_task)) {
-                               isc_refcount_decrement(
+                               isc_refcount_decrementz(
                                        &dev->newsocket->references);
                                closesocket(dev->newsocket->fd);
                                dev->newsocket->fd = INVALID_SOCKET;