From: Andy Polyakov Date: Sun, 29 Jul 2018 12:11:49 +0000 (+0200) Subject: lhash/lhash.c: switch to Thread-Sanitizer-friendly primitives. X-Git-Tag: OpenSSL_1_1_1-pre9~49 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=cab76c0f6482df5140efa2ca93c9e2d972fcd9b0;p=oweals%2Fopenssl.git lhash/lhash.c: switch to Thread-Sanitizer-friendly primitives. Reviewed-by: Paul Dale Reviewed-by: Rich Salz (Merged from https://github.com/openssl/openssl/pull/6786) --- diff --git a/crypto/lhash/lhash.c b/crypto/lhash/lhash.c index dca500723d..f7ac9d02f5 100644 --- a/crypto/lhash/lhash.c +++ b/crypto/lhash/lhash.c @@ -157,16 +157,18 @@ void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data) OPENSSL_LH_NODE **rn; void *ret; - lh->error = 0; + tsan_store((TSAN_QUALIFIER int *)&lh->error, 0); + rn = getrn(lh, data, &hash); if (*rn == NULL) { - lh->num_retrieve_miss++; + tsan_counter(&lh->num_retrieve_miss); return NULL; } else { ret = (*rn)->data; - lh->num_retrieve++; + tsan_counter(&lh->num_retrieve); } + return ret; } @@ -296,7 +298,7 @@ static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh, OPENSSL_LH_COMPFUNC cf; hash = (*(lh->hash)) (data); - lh->num_hash_calls++; + tsan_counter(&lh->num_hash_calls); *rhash = hash; nn = hash % lh->pmax; @@ -306,12 +308,12 @@ static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh, cf = lh->comp; ret = &(lh->b[(int)nn]); for (n1 = *ret; n1 != NULL; n1 = n1->next) { - lh->num_hash_comps++; + tsan_counter(&lh->num_hash_comps); if (n1->hash != hash) { ret = &(n1->next); continue; } - lh->num_comp_calls++; + tsan_counter(&lh->num_comp_calls); if (cf(n1->data, data) == 0) break; ret = &(n1->next); diff --git a/crypto/lhash/lhash_lcl.h b/crypto/lhash/lhash_lcl.h index 78691eb622..8f79232988 100644 --- a/crypto/lhash/lhash_lcl.h +++ b/crypto/lhash/lhash_lcl.h @@ -8,6 +8,8 @@ */ #include +#include "internal/tsan_assist.h" + struct lhash_node_st { void *data; struct lhash_node_st *next; @@ -29,14 +31,14 @@ struct lhash_st { unsigned long num_expand_reallocs; unsigned long num_contracts; unsigned long num_contract_reallocs; - unsigned long num_hash_calls; - unsigned long num_comp_calls; + TSAN_QUALIFIER unsigned long num_hash_calls; + TSAN_QUALIFIER unsigned long num_comp_calls; unsigned long num_insert; unsigned long num_replace; unsigned long num_delete; unsigned long num_no_delete; - unsigned long num_retrieve; - unsigned long num_retrieve_miss; - unsigned long num_hash_comps; + TSAN_QUALIFIER unsigned long num_retrieve; + TSAN_QUALIFIER unsigned long num_retrieve_miss; + TSAN_QUALIFIER unsigned long num_hash_comps; int error; };