X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fcore_namemap.c;h=e17b3ac0e289b486879ae4389c05ae45b0e816ae;hp=94c80de0917c2505468edf994415a378c84a7afe;hb=c720fc35f4aa90cdc7cdc424b976c5322fb0098e;hpb=7cc5e0d283800c757e46d1476273d271120aa38d diff --git a/crypto/core_namemap.c b/crypto/core_namemap.c index 94c80de091..e17b3ac0e2 100644 --- a/crypto/core_namemap.c +++ b/crypto/core_namemap.c @@ -11,6 +11,7 @@ #include "internal/namemap.h" #include #include "crypto/lhash.h" /* openssl_lh_strcasehash */ +#include "internal/tsan_assist.h" /*- * The namenum entry @@ -34,7 +35,12 @@ struct ossl_namemap_st { CRYPTO_RWLOCK *lock; LHASH_OF(NAMENUM_ENTRY) *namenum; /* Name->number mapping */ - int max_number; /* Current max number */ + +#ifdef tsan_ld_acq + TSAN_QUALIFIER int max_number; /* Current max number TSAN version */ +#else + int max_number; /* Current max number plain version */ +#endif }; /* LHASH callbacks */ @@ -91,14 +97,21 @@ static const OPENSSL_CTX_METHOD stored_namemap_method = { int ossl_namemap_empty(OSSL_NAMEMAP *namemap) { - int rv = 0; +#ifdef tsan_ld_acq + /* Have TSAN support */ + return namemap == NULL || tsan_load(&namemap->max_number) == 0; +#else + /* No TSAN support */ + int rv; + + if (namemap == NULL) + return 1; CRYPTO_THREAD_read_lock(namemap->lock); - if (namemap->max_number == 0) - rv = 1; + rv = namemap->max_number == 0; CRYPTO_THREAD_unlock(namemap->lock); - return rv; +#endif } typedef struct doall_names_data_st { @@ -216,7 +229,7 @@ int ossl_namemap_add_name_n(OSSL_NAMEMAP *namemap, int number, goto err; namenum->number = tmp_number = - number != 0 ? number : ++namemap->max_number; + number != 0 ? number : 1 + tsan_counter(&namemap->max_number); (void)lh_NAMENUM_ENTRY_insert(namemap->namenum, namenum); if (lh_NAMENUM_ENTRY_error(namemap->namenum))