Commit 9ca6ad63 authored by Mark Andrews's avatar Mark Andrews

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.
parent cf8e034b
Pipeline #26819 failed with stages
in 35 minutes and 39 seconds
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment