]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Note bucket lock requirements and move REQUIRE inside locked section.
authorMark Andrews <marka@isc.org>
Thu, 5 Dec 2019 04:25:21 +0000 (15:25 +1100)
committerMark Andrews <marka@isc.org>
Tue, 10 Dec 2019 22:16:15 +0000 (22:16 +0000)
lib/dns/resolver.c

index 9e625e79d5374b4e14b80957db783b8cb09c8a4b..d901465848c8a5e61288e06ba9e52f02096400fe 100644 (file)
@@ -320,7 +320,7 @@ struct fetchctx {
        /*%
         * The number of events we're waiting for.
         */
-       unsigned int                    pending;
+       unsigned int                    pending;        /* Bucket lock. */
 
        /*%
         * The number of times we've "restarted" the current
@@ -349,7 +349,7 @@ struct fetchctx {
        /*%
         * Number of queries that reference this context.
         */
-       unsigned int                    nqueries;
+       unsigned int                    nqueries;       /* Bucket lock. */
 
        /*%
         * The reason to print when logging a successful
@@ -394,7 +394,7 @@ struct fetchctx {
 #define FCTX_ATTR_HAVEANSWER            0x0001
 #define FCTX_ATTR_GLUING                0x0002
 #define FCTX_ATTR_ADDRWAIT              0x0004
-#define FCTX_ATTR_SHUTTINGDOWN          0x0008
+#define FCTX_ATTR_SHUTTINGDOWN          0x0008         /* Bucket lock */
 #define FCTX_ATTR_WANTCACHE             0x0010
 #define FCTX_ATTR_WANTNCACHE            0x0020
 #define FCTX_ATTR_NEEDEDNS0             0x0040
@@ -5291,11 +5291,12 @@ maybe_destroy(fetchctx_t *fctx, bool locked) {
        dns_validator_t *validator, *next_validator;
        bool dodestroy = false;
 
-       REQUIRE(SHUTTINGDOWN(fctx));
-
        bucketnum = fctx->bucketnum;
        if (!locked)
                LOCK(&res->buckets[bucketnum].lock);
+
+       REQUIRE(SHUTTINGDOWN(fctx));
+
        if (fctx->pending != 0 || fctx->nqueries != 0)
                goto unlock;
 
@@ -6991,6 +6992,9 @@ fctx_increference(fetchctx_t *fctx) {
        isc_refcount_increment(&fctx->references);
 }
 
+/*
+ * Requires bucket lock to be held.
+ */
 static bool
 fctx_decreference(fetchctx_t *fctx) {
        bool bucket_empty = false;