]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Only test node->data if we care about whether data is present or not.
authorMark Andrews <marka@isc.org>
Wed, 26 Aug 2020 06:24:13 +0000 (16:24 +1000)
committerMark Andrews <marka@isc.org>
Wed, 9 Sep 2020 06:22:39 +0000 (16:22 +1000)
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)

(cherry picked from commit 71ef3a8038718063d0e0deb17834c71daaa9f29b)

lib/dns/rbt.c

index 69b847c6d187d0f83a3a819e8e8bd4962a23529d..b9bf65cb0362c194d9c4f084e3a705be361dccc3 100644 (file)
@@ -231,6 +231,9 @@ getdata(dns_rbtnode_t *node, file_header_t *header) {
 #define IS_ROOT(node)     ((node)->is_root)
 #define FINDCALLBACK(node) ((node)->find_callback)
 
+#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.
@@ -1703,8 +1706,7 @@ dns_rbt_findnode(dns_rbt_t *rbt, const dns_name_t *name, dns_name_t *foundname,
                                /*
                                 * This might be the closest enclosing name.
                                 */
-                               if ((options & DNS_RBTFIND_EMPTYDATA) != 0 ||
-                                   DATA(current) != NULL) {
+                               if (WANTEMPTYDATA_OR_DATA(options, current)) {
                                        *node = current;
                                }
 
@@ -1776,7 +1778,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 &&
-           ((options & DNS_RBTFIND_EMPTYDATA) != 0 || DATA(current) != NULL))
+           WANTEMPTYDATA_OR_DATA(options, current))
        {
                /*
                 * Found an exact match.
@@ -2011,9 +2013,7 @@ 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 {
                result = ISC_R_NOTFOUND;
@@ -2881,7 +2881,7 @@ 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) {