From: Mark Andrews Date: Thu, 28 Nov 2019 22:59:03 +0000 (+1100) Subject: Assign fctx->client when fctx is created rather when the join happens. X-Git-Tag: v9.15.7~45^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ca6ad6311f3305cfefab32187c22afe48be30be;p=thirdparty%2Fbind9.git Assign fctx->client when fctx is created rather when the join happens. 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. --- diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 9fba6ca6630..9b89c0aa5a4 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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;