]> 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 02:54:47 +0000 (12:54 +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.

(cherry picked from commit bde5c7632ad62f5a9e7d2165695e6db2fc654e46)

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 98071f9d732005dafe5f209ce54ef09b16d62427..7e3aabe71f1404226bc7b4ed80fb0fe49b0dc1de 100644 (file)
@@ -9665,7 +9665,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 cb74157f1695fee64831bf4061a8051ce51ba234..f3a16085304e13944a8ae6561067bef3a51b9eec 100644 (file)
@@ -591,7 +591,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) {
@@ -1796,7 +1796,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);
@@ -2955,7 +2955,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 5bb835877d24b90c63c4bf852d8debe28bac11c6..6f15b99b12ceb64119ab592a2040677d59d4a577 100644 (file)
@@ -1047,9 +1047,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);
@@ -8704,7 +8702,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);
        }
@@ -8725,7 +8723,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 873148ee3c98426ef43ddf6cac7e13c106e5df5a..a661ab728398fc24cb559eb04eca768ef9c79823 100644 (file)
@@ -4497,7 +4497,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);
 
@@ -5197,7 +5197,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 e88d2cd688ed759e589aa3c825b383fc6bd43688..c5b76a4171b8034f609590007cf5bad0574bb5c5 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 2b6eb2194ddf9e2d3d31724ea8eca828ab765375..697a835e77e650e47bbd2385d2159e90bf2d9139 100644 (file)
@@ -1142,7 +1142,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 d3117d4d6a80277955c7389cedc38a389b125930..49c219e9e345f22efb54ecbd9040b9252a080795 100644 (file)
@@ -381,7 +381,7 @@ isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
 
 cleanup:
        httpdmgr->magic = 0;
-       isc_refcount_decrement(&httpdmgr->references);
+       isc_refcount_decrementz(&httpdmgr->references);
        isc_refcount_destroy(&httpdmgr->references);
        isc_task_detach(&httpdmgr->task);
        isc_socket_detach(&httpdmgr->sock);
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 1a90e780ee5533a4c02ab5a9c7755c7a47588b91..b1c04fa89a0c73840ec4ec87c650a188e08fa9ea 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 c6492985488810d5e347ea04bffed199c6087605..ca84b4bfaeabf6f86cf55d51990923aecfa0b12d 100644 (file)
@@ -3001,7 +3001,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);
        }
 
@@ -5083,7 +5083,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 d418cfdf1b00e92a49b9b41f9dff08d6460b4082..07f0242aed326da9a296050f7cdf9d5aaf246d17 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;