x509v3/v3_purp.c: re-implement lock-free check for extensions cache validity.
Reviewed-by: Paul Dale <paul.dale@oracle.com> Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6786)
This commit is contained in:
parent
0da7358b07
commit
f21b5b64cb
2 changed files with 12 additions and 0 deletions
|
@ -182,6 +182,7 @@ struct x509_st {
|
|||
unsigned char sha1_hash[SHA_DIGEST_LENGTH];
|
||||
X509_CERT_AUX *aux;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
volatile int ex_cached;
|
||||
} /* X509 */ ;
|
||||
|
||||
/*
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <openssl/x509v3.h>
|
||||
#include <openssl/x509_vfy.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include "internal/tsan_assist.h"
|
||||
|
||||
static void x509v3_cache_extensions(X509 *x);
|
||||
|
||||
|
@ -353,6 +354,10 @@ static void x509v3_cache_extensions(X509 *x)
|
|||
X509_EXTENSION *ex;
|
||||
int i;
|
||||
|
||||
/* fast lock-free check, see end of the function for details. */
|
||||
if (tsan_load((TSAN_QUALIFIER int *)&x->ex_cached))
|
||||
return;
|
||||
|
||||
CRYPTO_THREAD_write_lock(x->lock);
|
||||
if (x->ex_flags & EXFLAG_SET) {
|
||||
CRYPTO_THREAD_unlock(x->lock);
|
||||
|
@ -494,6 +499,12 @@ static void x509v3_cache_extensions(X509 *x)
|
|||
x509_init_sig_info(x);
|
||||
x->ex_flags |= EXFLAG_SET;
|
||||
CRYPTO_THREAD_unlock(x->lock);
|
||||
/*
|
||||
* It has to be placed after memory barrier, which is implied by unlock.
|
||||
* Worst thing that can happen is that another thread proceeds to lock
|
||||
* and checks x->ex_flags & EXFLAGS_SET. See beginning of the function.
|
||||
*/
|
||||
tsan_store((TSAN_QUALIFIER int *)&x->ex_cached, 1);
|
||||
}
|
||||
|
||||
/*-
|
||||
|
|
Loading…
Reference in a new issue