bind/backport-0038-Address-data-race-in-dns_adbentry_overquota.patch
jiangheng ad37c37958 backport some patches from community
(cherry picked from commit a9fd9ece9b9436b6103d084920c6897ef1adbae6)
2022-09-03 21:36:21 +08:00

99 lines
3.8 KiB
Diff

From 674a21946613ac624e22482ac8c66000fcc00792 Mon Sep 17 00:00:00 2001
From: Mark Andrews <marka@isc.org>
Date: Wed, 26 Aug 2020 15:50:53 +1000
Subject: [PATCH] Address data race in dns_adbentry_overquota
Read of size 4 at 0x7b440003da70 by thread T8:
#0 dns_adbentry_overquota /builds/isc-projects/bind9/lib/dns/adb.c:4797:39 (libdns.so.1110+0x4da82)
#1 fctx_try /builds/isc-projects/bind9/lib/dns/resolver.c:3838:10 (libdns.so.1110+0x17e229)
#2 fctx_start /builds/isc-projects/bind9/lib/dns/resolver.c:4219:4 (libdns.so.1110+0x1787a3)
#3 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507f5)
#4 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d749)
Previous write of size 4 at 0x7b440003da70 by thread T12 (mutexes: write M549293692588722840):
#0 dns_adb_beginudpfetch /builds/isc-projects/bind9/lib/dns/adb.c:4811:21 (libdns.so.1110+0x4db82)
#1 fctx_query /builds/isc-projects/bind9/lib/dns/resolver.c:1901:3 (libdns.so.1110+0x1814ee)
#2 fctx_try /builds/isc-projects/bind9/lib/dns/resolver.c:3863:11 (libdns.so.1110+0x17e2fa)
#3 fctx_start /builds/isc-projects/bind9/lib/dns/resolver.c:4219:4 (libdns.so.1110+0x1787a3)
#4 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507f5)
#5 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d749)
Conflict: NA
Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/674a21946613ac624e22482ac8c66000fcc00792
---
lib/dns/adb.c | 10 +++++++++-
lib/dns/include/dns/adb.h | 2 +-
lib/dns/resolver.c | 6 +++---
3 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/lib/dns/adb.c b/lib/dns/adb.c
index 5021a17fba..d6f56fa6d3 100644
--- a/lib/dns/adb.c
+++ b/lib/dns/adb.c
@@ -4791,10 +4791,18 @@ dns_adb_setquota(dns_adb_t *adb, uint32_t quota, uint32_t freq,
}
bool
-dns_adbentry_overquota(dns_adbentry_t *entry) {
+dns_adbentry_overquota(dns_adb_t *adb, dns_adbentry_t *entry) {
+ int bucket;
bool block;
+
REQUIRE(DNS_ADBENTRY_VALID(entry));
+
+ bucket = entry->lock_bucket;
+
+ LOCK(&adb->entrylocks[bucket]);
block = (entry->quota != 0 && entry->active >= entry->quota);
+ UNLOCK(&adb->entrylocks[bucket]);
+
return (block);
}
diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h
index edf6e54935..9e328ef5ad 100644
--- a/lib/dns/include/dns/adb.h
+++ b/lib/dns/include/dns/adb.h
@@ -815,7 +815,7 @@ dns_adb_setquota(dns_adb_t *adb, uint32_t quota, uint32_t freq,
*/
bool
-dns_adbentry_overquota(dns_adbentry_t *entry);
+dns_adbentry_overquota(dns_adb_t *adb, dns_adbentry_t *entry);
/*%<
* Returns true if the specified ADB has too many active fetches.
*
diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c
index cf6c00100c..5984e00ab8 100644
--- a/lib/dns/resolver.c
+++ b/lib/dns/resolver.c
@@ -1894,7 +1894,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
query->connects++;
QTRACE("connecting via TCP");
} else {
- if (dns_adbentry_overquota(addrinfo->entry))
+ if (dns_adbentry_overquota(fctx->adb, addrinfo->entry))
goto cleanup_dispatch;
/* Inform the ADB that we're starting a UDP fetch */
@@ -3809,7 +3809,7 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) {
addrinfo = fctx_nextaddress(fctx);
/* Try to find an address that isn't over quota */
- while (addrinfo != NULL && dns_adbentry_overquota(addrinfo->entry))
+ while (addrinfo != NULL && dns_adbentry_overquota(fctx->adb, addrinfo->entry))
addrinfo = fctx_nextaddress(fctx);
if (addrinfo == NULL) {
@@ -3835,7 +3835,7 @@ fctx_try(fetchctx_t *fctx, bool retrying, bool badcache) {
addrinfo = fctx_nextaddress(fctx);
while (addrinfo != NULL &&
- dns_adbentry_overquota(addrinfo->entry))
+ dns_adbentry_overquota(fctx->adb, addrinfo->entry))
addrinfo = fctx_nextaddress(fctx);
/*
--
2.23.0