Include more Thread Sanitizer changes
Fix as much race conditions as possible.
This commit is contained in:
parent
23657868e6
commit
43f4de9bf3
|
@ -0,0 +1,159 @@
|
||||||
|
From 638561615c37e8eace986e268811335c12d1b6a1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Andrews <marka@isc.org>
|
||||||
|
Date: Thu, 12 Dec 2019 20:41:44 +1100
|
||||||
|
Subject: [PATCH] give zspill its own lock
|
||||||
|
|
||||||
|
(cherry picked from commit a52189e8e67a20097539fe3e6f7da4e4c01dc340)
|
||||||
|
---
|
||||||
|
lib/dns/resolver.c | 45 +++++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 29 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c
|
||||||
|
index 9f65c0596a..04367f82c6 100644
|
||||||
|
--- a/lib/dns/resolver.c
|
||||||
|
+++ b/lib/dns/resolver.c
|
||||||
|
@@ -460,20 +460,21 @@ struct dns_resolver {
|
||||||
|
isc_mutex_t lock;
|
||||||
|
isc_mutex_t nlock;
|
||||||
|
isc_mutex_t primelock;
|
||||||
|
+ isc_mutex_t zspill_lock;
|
||||||
|
dns_rdataclass_t rdclass;
|
||||||
|
isc_socketmgr_t * socketmgr;
|
||||||
|
isc_timermgr_t * timermgr;
|
||||||
|
isc_taskmgr_t * taskmgr;
|
||||||
|
dns_view_t * view;
|
||||||
|
- bool frozen;
|
||||||
|
+ bool frozen;
|
||||||
|
unsigned int options;
|
||||||
|
dns_dispatchmgr_t * dispatchmgr;
|
||||||
|
dns_dispatchset_t * dispatches4;
|
||||||
|
- bool exclusivev4;
|
||||||
|
+ bool exclusivev4;
|
||||||
|
dns_dispatchset_t * dispatches6;
|
||||||
|
isc_dscp_t querydscp4;
|
||||||
|
isc_dscp_t querydscp6;
|
||||||
|
- bool exclusivev6;
|
||||||
|
+ bool exclusivev6;
|
||||||
|
unsigned int nbuckets;
|
||||||
|
fctxbucket_t * buckets;
|
||||||
|
zonebucket_t * dbuckets;
|
||||||
|
@@ -492,7 +493,7 @@ struct dns_resolver {
|
||||||
|
unsigned int spillatmax;
|
||||||
|
unsigned int spillatmin;
|
||||||
|
isc_timer_t * spillattimer;
|
||||||
|
- bool zero_no_soa_ttl;
|
||||||
|
+ bool zero_no_soa_ttl;
|
||||||
|
unsigned int query_timeout;
|
||||||
|
unsigned int maxdepth;
|
||||||
|
unsigned int maxqueries;
|
||||||
|
@@ -502,14 +503,16 @@ struct dns_resolver {
|
||||||
|
unsigned int retryinterval; /* in milliseconds */
|
||||||
|
unsigned int nonbackofftries;
|
||||||
|
|
||||||
|
+ /* Locked by lock. */
|
||||||
|
+ unsigned int zspill; /* fetches-per-zone */
|
||||||
|
+
|
||||||
|
/* Locked by lock. */
|
||||||
|
unsigned int references;
|
||||||
|
- bool exiting;
|
||||||
|
+ bool exiting;
|
||||||
|
isc_eventlist_t whenshutdown;
|
||||||
|
unsigned int activebuckets;
|
||||||
|
- bool priming;
|
||||||
|
+ bool priming;
|
||||||
|
unsigned int spillat; /* clients-per-query */
|
||||||
|
- unsigned int zspill; /* fetches-per-zone */
|
||||||
|
|
||||||
|
dns_badcache_t * badcache; /* Bad cache. */
|
||||||
|
|
||||||
|
@@ -1257,7 +1260,7 @@ fcount_incr(fetchctx_t *fctx, bool force) {
|
||||||
|
isc_result_t result = ISC_R_SUCCESS;
|
||||||
|
zonebucket_t *dbucket;
|
||||||
|
fctxcount_t *counter;
|
||||||
|
- unsigned int bucketnum, spill;
|
||||||
|
+ unsigned int bucketnum;
|
||||||
|
|
||||||
|
REQUIRE(fctx != NULL);
|
||||||
|
REQUIRE(fctx->res != NULL);
|
||||||
|
@@ -1266,10 +1269,6 @@ fcount_incr(fetchctx_t *fctx, bool force) {
|
||||||
|
bucketnum = dns_name_fullhash(&fctx->domain, false)
|
||||||
|
% RES_DOMAIN_BUCKETS;
|
||||||
|
|
||||||
|
- LOCK(&fctx->res->lock);
|
||||||
|
- spill = fctx->res->zspill;
|
||||||
|
- UNLOCK(&fctx->res->lock);
|
||||||
|
-
|
||||||
|
dbucket = &fctx->res->dbuckets[bucketnum];
|
||||||
|
|
||||||
|
LOCK(&dbucket->lock);
|
||||||
|
@@ -1297,6 +1296,12 @@ fcount_incr(fetchctx_t *fctx, bool force) {
|
||||||
|
ISC_LIST_APPEND(dbucket->list, counter, link);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
+ unsigned int spill;
|
||||||
|
+
|
||||||
|
+ LOCK(&fctx->res->zspill_lock);
|
||||||
|
+ spill = fctx->res->zspill;
|
||||||
|
+ UNLOCK(&fctx->res->zspill_lock);
|
||||||
|
+
|
||||||
|
if (!force && spill != 0 && counter->count >= spill) {
|
||||||
|
counter->dropped++;
|
||||||
|
fcount_logspill(fctx, counter);
|
||||||
|
@@ -8811,6 +8816,7 @@ destroy(dns_resolver_t *res) {
|
||||||
|
|
||||||
|
INSIST(res->nfctx == 0);
|
||||||
|
|
||||||
|
+ DESTROYLOCK(&res->zspill_lock);
|
||||||
|
DESTROYLOCK(&res->primelock);
|
||||||
|
DESTROYLOCK(&res->nlock);
|
||||||
|
DESTROYLOCK(&res->lock);
|
||||||
|
@@ -9089,10 +9095,14 @@ dns_resolver_create(dns_view_t *view,
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto cleanup_nlock;
|
||||||
|
|
||||||
|
+ result = isc_mutex_init(&res->zspill_lock);
|
||||||
|
+ if (result != ISC_R_SUCCESS)
|
||||||
|
+ goto cleanup_primelock;
|
||||||
|
+
|
||||||
|
task = NULL;
|
||||||
|
result = isc_task_create(taskmgr, 0, &task);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
- goto cleanup_primelock;
|
||||||
|
+ goto cleanup_zspill_lock;
|
||||||
|
isc_task_setname(task, "resolver_task", NULL);
|
||||||
|
|
||||||
|
result = isc_timer_create(timermgr, isc_timertype_inactive, NULL, NULL,
|
||||||
|
@@ -9100,7 +9110,7 @@ dns_resolver_create(dns_view_t *view,
|
||||||
|
&res->spillattimer);
|
||||||
|
isc_task_detach(&task);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
- goto cleanup_primelock;
|
||||||
|
+ goto cleanup_zspill_lock;
|
||||||
|
|
||||||
|
#if USE_ALGLOCK
|
||||||
|
result = isc_rwlock_init(&res->alglock, 0, 0);
|
||||||
|
@@ -9133,6 +9143,9 @@ dns_resolver_create(dns_view_t *view,
|
||||||
|
isc_timer_detach(&res->spillattimer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ cleanup_zspill_lock:
|
||||||
|
+ DESTROYLOCK(&res->zspill_lock);
|
||||||
|
+
|
||||||
|
cleanup_primelock:
|
||||||
|
DESTROYLOCK(&res->primelock);
|
||||||
|
|
||||||
|
@@ -10275,9 +10288,9 @@ dns_resolver_setfetchesperzone(dns_resolver_t *resolver, uint32_t clients)
|
||||||
|
{
|
||||||
|
REQUIRE(VALID_RESOLVER(resolver));
|
||||||
|
|
||||||
|
- LOCK(&resolver->lock);
|
||||||
|
+ LOCK(&resolver->zspill_lock);
|
||||||
|
resolver->zspill = clients;
|
||||||
|
- UNLOCK(&resolver->lock);
|
||||||
|
+ UNLOCK(&resolver->zspill_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
From 23a6775f62deeee63e9f7927be387fecf23a8074 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= <ondrej@isc.org>
|
||||||
|
Date: Tue, 10 Dec 2019 10:02:09 +0100
|
||||||
|
Subject: [PATCH] Ensure all zone_settimer() calls are done on locked zone
|
||||||
|
|
||||||
|
(cherry picked from commit cf48e8eb326f824170f2069e5d5c33992b1783a4)
|
||||||
|
(cherry picked from commit 3bac7e98074643ff62582545e5840e4195517b07)
|
||||||
|
---
|
||||||
|
lib/dns/zone.c | 9 +++++----
|
||||||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/dns/zone.c b/lib/dns/zone.c
|
||||||
|
index e8cff77588..db837aae50 100644
|
||||||
|
--- a/lib/dns/zone.c
|
||||||
|
+++ b/lib/dns/zone.c
|
||||||
|
@@ -10291,7 +10291,9 @@ zone_maintenance(dns_zone_t *zone) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+ LOCK_ZONE(zone);
|
||||||
|
zone_settimer(zone, &now);
|
||||||
|
+ UNLOCK_ZONE(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -13081,6 +13083,7 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
|
REQUIRE(DNS_ZONE_VALID(zone));
|
||||||
|
+ REQUIRE(LOCKED_ZONE(zone));
|
||||||
|
ENTER;
|
||||||
|
|
||||||
|
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING))
|
||||||
|
@@ -18405,6 +18408,7 @@ zone_rekey(dns_zone_t *zone) {
|
||||||
|
UNLOCK_ZONE(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ LOCK_ZONE(zone);
|
||||||
|
isc_time_settoepoch(&zone->refreshkeytime);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -18416,11 +18420,9 @@ zone_rekey(dns_zone_t *zone) {
|
||||||
|
isc_time_t timethen;
|
||||||
|
isc_stdtime_t then;
|
||||||
|
|
||||||
|
- LOCK_ZONE(zone);
|
||||||
|
DNS_ZONE_TIME_ADD(&timenow, zone->refreshkeyinterval,
|
||||||
|
&timethen);
|
||||||
|
zone->refreshkeytime = timethen;
|
||||||
|
- UNLOCK_ZONE(zone);
|
||||||
|
|
||||||
|
for (key = ISC_LIST_HEAD(dnskeys);
|
||||||
|
key != NULL;
|
||||||
|
@@ -18431,12 +18433,10 @@ zone_rekey(dns_zone_t *zone) {
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen);
|
||||||
|
- LOCK_ZONE(zone);
|
||||||
|
if (isc_time_compare(&timethen,
|
||||||
|
&zone->refreshkeytime) < 0) {
|
||||||
|
zone->refreshkeytime = timethen;
|
||||||
|
}
|
||||||
|
- UNLOCK_ZONE(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
zone_settimer(zone, &timenow);
|
||||||
|
@@ -18444,6 +18444,7 @@ zone_rekey(dns_zone_t *zone) {
|
||||||
|
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
|
||||||
|
dns_zone_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf);
|
||||||
|
}
|
||||||
|
+ UNLOCK_ZONE(zone);
|
||||||
|
|
||||||
|
done:
|
||||||
|
dns_diff_clear(&diff);
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
From 7e844b093b0442bdc5cdc5aefd56fdc05f9be88f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Andrews <marka@isc.org>
|
||||||
|
Date: Thu, 12 Dec 2019 19:17:39 +1100
|
||||||
|
Subject: [PATCH] acquire task lock before calling push_readyq for task->flags
|
||||||
|
access
|
||||||
|
|
||||||
|
(cherry picked from commit 7c94d2cd7dfaa3f04cd86ad9ed97e8366a774a4c)
|
||||||
|
---
|
||||||
|
lib/isc/task.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/isc/task.c b/lib/isc/task.c
|
||||||
|
index 329604a465..f9c4354bd2 100644
|
||||||
|
--- a/lib/isc/task.c
|
||||||
|
+++ b/lib/isc/task.c
|
||||||
|
@@ -473,7 +473,9 @@ task_ready(isc__task_t *task) {
|
||||||
|
XTRACE("task_ready");
|
||||||
|
|
||||||
|
LOCK(&manager->lock);
|
||||||
|
+ LOCK(&task->lock);
|
||||||
|
push_readyq(manager, task);
|
||||||
|
+ UNLOCK(&task->lock);
|
||||||
|
#ifdef USE_WORKER_THREADS
|
||||||
|
if (manager->mode == isc_taskmgrmode_normal || has_privilege)
|
||||||
|
SIGNAL(&manager->work_available);
|
||||||
|
@@ -1263,7 +1265,9 @@ dispatch(isc__taskmgr_t *manager) {
|
||||||
|
* might even hurt rather than help.
|
||||||
|
*/
|
||||||
|
#ifdef USE_WORKER_THREADS
|
||||||
|
+ LOCK(&task->lock);
|
||||||
|
push_readyq(manager, task);
|
||||||
|
+ UNLOCK(&task->lock);
|
||||||
|
#else
|
||||||
|
ENQUEUE(new_ready_tasks, task, ready_link);
|
||||||
|
if ((task->flags & TASK_F_PRIVILEGED) != 0)
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
11
bind.spec
11
bind.spec
|
@ -64,7 +64,7 @@ Summary: The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) serv
|
||||||
Name: bind
|
Name: bind
|
||||||
License: MPLv2.0
|
License: MPLv2.0
|
||||||
Version: 9.11.14
|
Version: 9.11.14
|
||||||
Release: 1%{?PATCHVER:.%{PATCHVER}}%{?PREVER:.%{PREVER}}%{?dist}
|
Release: 2%{?PATCHVER:.%{PATCHVER}}%{?PREVER:.%{PREVER}}%{?dist}
|
||||||
Epoch: 32
|
Epoch: 32
|
||||||
Url: https://www.isc.org/downloads/bind/
|
Url: https://www.isc.org/downloads/bind/
|
||||||
#
|
#
|
||||||
|
@ -165,6 +165,9 @@ Patch177: bind-9.11-serve-stale.patch
|
||||||
Patch178: bind-9.11-serve-stale-dbfix.patch
|
Patch178: bind-9.11-serve-stale-dbfix.patch
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1736762
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1736762
|
||||||
Patch183: bind-9.11-rh1736762-5.patch
|
Patch183: bind-9.11-rh1736762-5.patch
|
||||||
|
Patch184: bind-9.11-rh1736762-6.patch
|
||||||
|
Patch185: bind-9.11-rh1736762-7.patch
|
||||||
|
Patch186: bind-9.11-rh1736762-8.patch
|
||||||
|
|
||||||
# SDB patches
|
# SDB patches
|
||||||
Patch11: bind-9.3.2b2-sdbsrc.patch
|
Patch11: bind-9.3.2b2-sdbsrc.patch
|
||||||
|
@ -571,6 +574,9 @@ are used for building ISC DHCP.
|
||||||
%patch177 -p1 -b .serve-stale
|
%patch177 -p1 -b .serve-stale
|
||||||
%patch178 -p1 -b .rh1770492
|
%patch178 -p1 -b .rh1770492
|
||||||
%patch183 -p1 -b .rh1736762-5
|
%patch183 -p1 -b .rh1736762-5
|
||||||
|
%patch184 -p1 -b .rh1736762-6
|
||||||
|
%patch185 -p1 -b .rh1736762-7
|
||||||
|
%patch186 -p1 -b .rh1736762-8
|
||||||
|
|
||||||
mkdir lib/dns/tests/testdata/dstrandom
|
mkdir lib/dns/tests/testdata/dstrandom
|
||||||
cp -a %{SOURCE50} lib/dns/tests/testdata/dstrandom/random.data
|
cp -a %{SOURCE50} lib/dns/tests/testdata/dstrandom/random.data
|
||||||
|
@ -1607,6 +1613,9 @@ fi;
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Dec 19 2019 Petr Menšík <pemensik@redhat.com> - 32:9.11.14-2
|
||||||
|
- Include more Thread Sanitizer detected changes (#1736762)
|
||||||
|
|
||||||
* Thu Dec 19 2019 Petr Menšík <pemensik@redhat.com> - 32:9.11.14-1
|
* Thu Dec 19 2019 Petr Menšík <pemensik@redhat.com> - 32:9.11.14-1
|
||||||
- Update to 9.11.14
|
- Update to 9.11.14
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue