101 lines
4.4 KiB
Diff
101 lines
4.4 KiB
Diff
From 80bf3f38525a8fddca2bbc61d8fe228475cc7c1e Mon Sep 17 00:00:00 2001
|
|
From: Mark Andrews <marka@isc.org>
|
|
Date: Wed, 26 Aug 2020 16:24:13 +1000
|
|
Subject: [PATCH] Only test node->data if we care about whether data is present
|
|
or not.
|
|
|
|
WARNING: ThreadSanitizer: data race (pid=28788)
|
|
Write of size 8 at 0x7b200002e060 by thread T1 (mutexes: write M2947):
|
|
#0 add32 /builds/isc-projects/bind9/lib/dns/rbtdb.c:6638:18 (libdns.so.1110+0xe7843)
|
|
#1 addrdataset /builds/isc-projects/bind9/lib/dns/rbtdb.c:6975:12 (libdns.so.1110+0xe4185)
|
|
#2 dns_db_addrdataset /builds/isc-projects/bind9/lib/dns/db.c:783:10 (libdns.so.1110+0x650ee)
|
|
#3 validated /builds/isc-projects/bind9/lib/dns/resolver.c:5140:11 (libdns.so.1110+0x1909f7)
|
|
#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)
|
|
|
|
Previous read of size 8 at 0x7b200002e060 by thread T5 (mutexes: write M521146194917735760):
|
|
#0 dns_rbt_findnode /builds/isc-projects/bind9/lib/dns/rbt.c:1708:9 (libdns.so.1110+0xd910d)
|
|
#1 cache_find /builds/isc-projects/bind9/lib/dns/rbtdb.c:5098:11 (libdns.so.1110+0xe188e)
|
|
#2 dns_db_find /builds/isc-projects/bind9/lib/dns/db.c:554:11 (libdns.so.1110+0x642bb)
|
|
#3 dns_view_find2 /builds/isc-projects/bind9/lib/dns/view.c:1068:11 (libdns.so.1110+0x1cc2c4)
|
|
#4 dbfind_name /builds/isc-projects/bind9/lib/dns/adb.c:3714:11 (libdns.so.1110+0x46a4b)
|
|
#5 dns_adb_createfind2 /builds/isc-projects/bind9/lib/dns/adb.c:3133:12 (libdns.so.1110+0x45278)
|
|
#6 findname /builds/isc-projects/bind9/lib/dns/resolver.c:3166:11 (libdns.so.1110+0x1827f0)
|
|
#7 fctx_getaddresses /builds/isc-projects/bind9/lib/dns/resolver.c:3462:3 (libdns.so.1110+0x18032d)
|
|
#8 fctx_try /builds/isc-projects/bind9/lib/dns/resolver.c:3819:12 (libdns.so.1110+0x17e174)
|
|
#9 fctx_start /builds/isc-projects/bind9/lib/dns/resolver.c:4219:4 (libdns.so.1110+0x1787a3)
|
|
#10 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507f5)
|
|
#11 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/80bf3f38525a8fddca2bbc61d8fe228475cc7c1e
|
|
---
|
|
lib/dns/rbt.c | 19 +++++++++++--------
|
|
1 file changed, 11 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c
|
|
index 04cf306220..d886d5bbbf 100644
|
|
--- a/lib/dns/rbt.c
|
|
+++ b/lib/dns/rbt.c
|
|
@@ -218,6 +218,9 @@ getdata(dns_rbtnode_t *node, file_header_t *header) {
|
|
#define IS_ROOT(node) ((node)->is_root == 1)
|
|
#define FINDCALLBACK(node) ((node)->find_callback == 1)
|
|
|
|
+#define WANTEMPTYDATA_OR_DATA(options, node) \
|
|
+ ((options & DNS_RBTFIND_EMPTYDATA) != 0 || DATA(node) != NULL)
|
|
+
|
|
/*%
|
|
* Structure elements from the rbtdb.c, not
|
|
* used as part of the rbt.c algorithms.
|
|
@@ -1705,9 +1708,9 @@ dns_rbt_findnode(dns_rbt_t *rbt, const dns_name_t *name, dns_name_t *foundname,
|
|
/*
|
|
* This might be the closest enclosing name.
|
|
*/
|
|
- if (DATA(current) != NULL ||
|
|
- (options & DNS_RBTFIND_EMPTYDATA) != 0)
|
|
+ if (WANTEMPTYDATA_OR_DATA(options, current)) {
|
|
*node = current;
|
|
+ }
|
|
|
|
/*
|
|
* Point the chain to the next level. This
|
|
@@ -1778,8 +1781,7 @@ dns_rbt_findnode(dns_rbt_t *rbt, const dns_name_t *name, dns_name_t *foundname,
|
|
* ISC_R_SUCCESS to indicate an exact match.
|
|
*/
|
|
if (current != NULL && (options & DNS_RBTFIND_NOEXACT) == 0 &&
|
|
- (DATA(current) != NULL ||
|
|
- (options & DNS_RBTFIND_EMPTYDATA) != 0)) {
|
|
+ (WANTEMPTYDATA_OR_DATA(options, current))) {
|
|
/*
|
|
* Found an exact match.
|
|
*/
|
|
@@ -2016,11 +2018,11 @@ dns_rbt_findname(dns_rbt_t *rbt, const dns_name_t *name, unsigned int options,
|
|
result = dns_rbt_findnode(rbt, name, foundname, &node, NULL,
|
|
options, NULL, NULL);
|
|
|
|
- if (node != NULL &&
|
|
- (DATA(node) != NULL || (options & DNS_RBTFIND_EMPTYDATA) != 0))
|
|
+ if (node != NULL && WANTEMPTYDATA_OR_DATA(options, node)) {
|
|
*data = DATA(node);
|
|
- else
|
|
+ } else {
|
|
result = ISC_R_NOTFOUND;
|
|
+ }
|
|
|
|
return (result);
|
|
}
|
|
@@ -2857,9 +2859,10 @@ deletetreeflat(dns_rbt_t *rbt, unsigned int quantum, bool unhash,
|
|
dns_rbtnode_t *node = root;
|
|
root = PARENT(root);
|
|
|
|
- if (DATA(node) != NULL && rbt->data_deleter != NULL)
|
|
+ if (rbt->data_deleter != NULL && DATA(node) != NULL) {
|
|
rbt->data_deleter(DATA(node),
|
|
rbt->deleter_arg);
|
|
+ }
|
|
if (unhash)
|
|
unhash_node(rbt, node);
|
|
/*
|
|
--
|
|
2.23.0
|
|
|