Ignore TSAN errors accessing init_count and header->count

WARNING: ThreadSanitizer: data race
    Write of size 4 at 0x000000000001 by thread T1 (mutexes: write M1):
    #0 subtractrdataset lib/dns/rbtdb.c:7065:21
    #1 dns_db_subtractrdataset lib/dns/db.c:807:10
    #2 diff_apply lib/dns/diff.c:377:14
    #3 dns_diff_apply lib/dns/diff.c:458:10
    #4 do_one_tuple lib/dns/zone.c:4103:11
    #5 update_one_rr lib/dns/zone.c:4132:10
    #6 keyfetch_done lib/dns/zone.c:9835:4
    #7 dispatch lib/isc/task.c:1157:7
    #8 run lib/isc/task.c:1331:2

    Previous write of size 4 at 0x000000000001 by thread T2 (mutexes: write M2):
    #0 addrdataset lib/dns/rbtdb.c:6869:21
    #1 dns_db_addrdataset lib/dns/db.c:783:10
    #2 addoptout lib/dns/ncache.c:264:10
    #3 dns_ncache_add lib/dns/ncache.c:101:10
    #4 ncache_adderesult lib/dns/resolver.c:5989:12
    #5 ncache_message lib/dns/resolver.c:6165:11
    #6 resquery_response lib/dns/resolver.c:8691:12
    #7 dispatch lib/isc/task.c:1157:7
    #8 run lib/isc/task.c:1331:2
This commit is contained in:
Mark Andrews
2020-12-10 06:31:19 +00:00
parent fdb893ede1
commit d85196cdca
+16 -4
View File
@@ -1041,6 +1041,18 @@ hexdump(const char *desc, unsigned char *data, size_t size) {
#define DNS_RDATASET_COUNT 0
#endif /* DNS_RDATASET_FIXED */
ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE unsigned int
get_init_count(void) {
unsigned int value = DNS_RBTDB_INC(init_count);
return (value);
}
ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE unsigned int
get_header_count(rdatasetheader_t *header) {
unsigned int value = DNS_RBTDB_INC(header->count);
return (value);
}
/*
* DB Routines
*/
@@ -3347,7 +3359,7 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, rdatasetheader_t *header,
rdataset->private2 = node;
raw = (unsigned char *)header + sizeof(*header);
rdataset->private3 = raw;
rdataset->count = DNS_RBTDB_INC(header->count);
rdataset->count = get_header_count(header);
if (rdataset->count == UINT32_MAX)
rdataset->count = 0;
@@ -6865,7 +6877,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
newheader->attributes |= RDATASET_ATTR_ZEROTTL;
newheader->noqname = NULL;
newheader->closest = NULL;
newheader->count = DNS_RBTDB_INC(init_count);
newheader->count = get_init_count();
newheader->trust = rdataset->trust;
newheader->additional_auth = NULL;
newheader->additional_glue = NULL;
@@ -7061,7 +7073,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
newheader->trust = 0;
newheader->noqname = NULL;
newheader->closest = NULL;
newheader->count = DNS_RBTDB_INC(init_count);
newheader->count = get_init_count();
newheader->additional_auth = NULL;
newheader->additional_glue = NULL;
newheader->last_used = 0;
@@ -7507,7 +7519,7 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
newheader->serial = 1;
newheader->noqname = NULL;
newheader->closest = NULL;
newheader->count = DNS_RBTDB_INC(init_count);
newheader->count = get_init_count();
newheader->additional_auth = NULL;
newheader->additional_glue = NULL;
newheader->last_used = 0;