From ce6c0c26a0263b98a88b7c7a1520a69b1f056ecc Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 28 Aug 2024 11:37:05 +1000 Subject: [PATCH 1/2] Use an accessor fuction to access find->status find->status is marked as private and access is controlled by find->lock. (cherry picked from commit c900300f21878de894c1d2f67b5662563aed9500) --- lib/dns/adb.c | 12 ++++++++++++ lib/dns/include/dns/adb.h | 10 ++++++++++ lib/dns/resolver.c | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/dns/adb.c b/lib/dns/adb.c index a8214c9d39..51521ad892 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -2324,6 +2324,18 @@ dns_adb_cancelfind(dns_adbfind_t *find) { } } +unsigned int +dns_adb_findstatus(dns_adbfind_t *find) { + unsigned int status; + REQUIRE(DNS_ADBFIND_VALID(find)); + + UNLOCK(&find->lock); + status = find->status; + UNLOCK(&find->lock); + + return (status); +} + void dns_adb_dump(dns_adb_t *adb, FILE *f) { isc_stdtime_t now = isc_stdtime_now(); diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 65acb09ccf..9b40ab8f26 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -387,6 +387,16 @@ dns_adbfind_done(dns_adbfind_t find); *\li 'find' != NULL and *find be valid dns_adbfind_t pointer. */ +unsigned int +dns_adb_findstatus(dns_adbfind_t *); +/*%< + * Returns the status field of the find. + * + * Requires: + * + *\li 'find' be a valid dns_adbfind_t pointer. + */ + void dns_adb_destroyfind(dns_adbfind_t **find); /*%< diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index b557b5ac60..9957663c2d 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -2910,7 +2910,7 @@ fctx_finddone(void *arg) { * The fetch is waiting for a name to be found. */ INSIST(!SHUTTINGDOWN(fctx)); - if (find->status == DNS_ADB_MOREADDRESSES) { + if (dns_adb_findstatus(find) == DNS_ADB_MOREADDRESSES) { FCTX_ATTR_CLR(fctx, FCTX_ATTR_ADDRWAIT); want_try = true; } else { From 1be660a1a22629c5da524a500aa6f4f9bd8c927a Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 16 Jul 2024 13:36:54 +1000 Subject: [PATCH 2/2] Use atomics to access find->status (cherry picked from commit a45e39d114f9066522625fda77d6a1a782699ded) --- lib/dns/adb.c | 13 ++++--------- lib/dns/include/dns/adb.h | 18 +++++++++--------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 51521ad892..f1da638e5f 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -937,7 +937,7 @@ clean_finds_at_name(dns_adbname_t *name, dns_adbstatus_t astat, INSIST(!FIND_EVENTSENT(find)); - find->status = astat; + atomic_store(&find->status, astat); DP(DEF_LEVEL, "cfan: sending find %p to caller", find); @@ -2225,7 +2225,7 @@ post_copy: if (want_event) { INSIST((find->flags & DNS_ADBFIND_ADDRESSMASK) != 0); find->loop = loop; - find->status = DNS_ADB_UNSET; + atomic_store(&find->status, DNS_ADB_UNSET); find->cb = cb; find->cbarg = cbarg; } @@ -2279,7 +2279,7 @@ dns_adb_destroyfind(dns_adbfind_t **findp) { static void find_sendevent(dns_adbfind_t *find) { if (!FIND_EVENTSENT(find)) { - find->status = DNS_ADB_CANCELED; + atomic_store(&find->status, DNS_ADB_CANCELED); DP(DEF_LEVEL, "sending find %p to caller", find); @@ -2326,14 +2326,9 @@ dns_adb_cancelfind(dns_adbfind_t *find) { unsigned int dns_adb_findstatus(dns_adbfind_t *find) { - unsigned int status; REQUIRE(DNS_ADBFIND_VALID(find)); - UNLOCK(&find->lock); - status = find->status; - UNLOCK(&find->lock); - - return (status); + return (atomic_load(&find->status)); } void diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 9b40ab8f26..91f7039b73 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -121,15 +121,15 @@ struct dns_adbfind { ISC_LINK(dns_adbfind_t) publink; /*%< RW: client use */ /* Private */ - isc_mutex_t lock; /* locks all below */ - in_port_t port; - unsigned int flags; - dns_adbname_t *adbname; - dns_adb_t *adb; - isc_loop_t *loop; - dns_adbstatus_t status; - isc_job_cb cb; - void *cbarg; + isc_mutex_t lock; /* locks all below */ + in_port_t port; + unsigned int flags; + dns_adbname_t *adbname; + dns_adb_t *adb; + isc_loop_t *loop; + _Atomic(dns_adbstatus_t) status; + isc_job_cb cb; + void *cbarg; ISC_LINK(dns_adbfind_t) plink; };