]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Assign fctx->client when fctx is created rather when the join happens.
authorMark Andrews <marka@isc.org>
Thu, 28 Nov 2019 22:59:03 +0000 (09:59 +1100)
committerMark Andrews <marka@isc.org>
Mon, 2 Dec 2019 06:01:46 +0000 (06:01 +0000)
This prevents races on fctx->client whenever a new fetch joins a existing
fetch (by calling fctx_join) as it is now invariant for the active life of
fctx.

lib/dns/resolver.c

index 9fba6ca6630a5a2f47a9b0a8686a8d7f683f2405..9b89c0aa5a43558ad05066e4c4a978834fe619a8 100644 (file)
@@ -359,8 +359,8 @@ struct fetchctx {
        /*%
         * Random numbers to use for mixing up server addresses.
         */
-       uint32_t                    rand_buf;
-       uint32_t                    rand_bits;
+       uint32_t                        rand_buf;
+       uint32_t                        rand_bits;
 
        /*%
         * Fetch-local statistics for detailed logging.
@@ -370,7 +370,7 @@ struct fetchctx {
        int                             exitline;
        isc_time_t                      start;
        uint64_t                        duration;
-       bool                    logged;
+       bool                            logged;
        unsigned int                    querysent;
        unsigned int                    referrals;
        unsigned int                    lamecount;
@@ -380,7 +380,7 @@ struct fetchctx {
        unsigned int                    adberr;
        unsigned int                    findfail;
        unsigned int                    valfail;
-       bool                    timeout;
+       bool                            timeout;
        dns_adbaddrinfo_t               *addrinfo;
        const isc_sockaddr_t            *client;
        dns_messageid_t                 id;
@@ -4692,8 +4692,6 @@ fctx_join(fetchctx_t *fctx, isc_task_t *task, const isc_sockaddr_t *client,
 
        fctx_increference(fctx);
 
-       fctx->client = client;
-
        fetch->magic = DNS_FETCH_MAGIC;
        fetch->private = fctx;
 
@@ -4717,8 +4715,9 @@ log_ns_ttl(fetchctx_t *fctx, const char *where) {
 static isc_result_t
 fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type,
            const dns_name_t *domain, dns_rdataset_t *nameservers,
-           unsigned int options, unsigned int bucketnum, unsigned int depth,
-           isc_counter_t *qc, fetchctx_t **fctxp)
+           const isc_sockaddr_t *client, unsigned int options,
+           unsigned int bucketnum, unsigned int depth, isc_counter_t *qc,
+           fetchctx_t **fctxp)
 {
        fetchctx_t *fctx;
        isc_result_t result;
@@ -4830,7 +4829,7 @@ fctx_create(dns_resolver_t *res, const dns_name_t *name, dns_rdatatype_t type,
        fctx->rand_bits = 0;
        fctx->timeout = false;
        fctx->addrinfo = NULL;
-       fctx->client = NULL;
+       fctx->client = client;
        fctx->ns_ttl = 0;
        fctx->ns_ttl_ok = false;
 
@@ -10569,7 +10568,8 @@ dns_resolver_createfetch(dns_resolver_t *res, const dns_name_t *name,
 
        if (fctx == NULL) {
                result = fctx_create(res, name, type, domain, nameservers,
-                                    options, bucketnum, depth, qc, &fctx);
+                                    client, options, bucketnum, depth, qc,
+                                    &fctx);
                if (result != ISC_R_SUCCESS)
                        goto unlock;
                new_fctx = true;