Skip to content

Commit

Permalink
tls: update to structure based atomics
Browse files Browse the repository at this point in the history
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from #21260)
  • Loading branch information
paulidale committed Jul 1, 2023
1 parent 59a9670 commit 43a07d6
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 40 deletions.
14 changes: 4 additions & 10 deletions ssl/ssl_cert.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,10 @@ CERT *ssl_cert_new(size_t ssl_pkey_num)
}

ret->key = &(ret->pkeys[SSL_PKEY_RSA]);
ret->references = 1;
ret->sec_cb = ssl_security_default_callback;
ret->sec_level = OPENSSL_TLS_SECURITY_LEVEL;
ret->sec_ex = NULL;
ret->lock = CRYPTO_THREAD_lock_new();
if (ret->lock == NULL) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
if (!CRYPTO_NEW_REF(&ret->references, 1)) {
OPENSSL_free(ret->pkeys);
OPENSSL_free(ret);
return NULL;
Expand All @@ -111,11 +108,8 @@ CERT *ssl_cert_dup(CERT *cert)
return NULL;
}

ret->references = 1;
ret->key = &ret->pkeys[cert->key - cert->pkeys];
ret->lock = CRYPTO_THREAD_lock_new();
if (ret->lock == NULL) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
if (!CRYPTO_NEW_REF(&ret->references, 1)) {
OPENSSL_free(ret->pkeys);
OPENSSL_free(ret);
return NULL;
Expand Down Expand Up @@ -272,7 +266,7 @@ void ssl_cert_free(CERT *c)

if (c == NULL)
return;
CRYPTO_DOWN_REF(&c->references, &i, c->lock);
CRYPTO_DOWN_REF(&c->references, &i);
REF_PRINT_COUNT("CERT", c);
if (i > 0)
return;
Expand All @@ -291,7 +285,7 @@ void ssl_cert_free(CERT *c)
OPENSSL_free(c->psk_identity_hint);
#endif
OPENSSL_free(c->pkeys);
CRYPTO_THREAD_lock_free(c->lock);
CRYPTO_FREE_REF(&c->references);
OPENSSL_free(c);
}

Expand Down
9 changes: 4 additions & 5 deletions ssl/ssl_cert_comp.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,9 @@ static OSSL_COMP_CERT *OSSL_COMP_CERT_new(unsigned char *data, size_t len, size_
if (!ossl_comp_has_alg(alg)
|| data == NULL
|| (ret = OPENSSL_zalloc(sizeof(*ret))) == NULL
|| (ret->lock = CRYPTO_THREAD_lock_new()) == NULL)
|| !CRYPTO_NEW_REF(&ret->references, 1))
goto err;

ret->references = 1;
ret->data = data;
ret->len = len;
ret->orig_len = orig_len;
Expand Down Expand Up @@ -136,21 +135,21 @@ void OSSL_COMP_CERT_free(OSSL_COMP_CERT *cc)
if (cc == NULL)
return;

CRYPTO_DOWN_REF(&cc->references, &i, cc->lock);
CRYPTO_DOWN_REF(&cc->references, &i);
REF_PRINT_COUNT("OSSL_COMP_CERT", cc);
if (i > 0)
return;
REF_ASSERT_ISNT(i < 0);

OPENSSL_free(cc->data);
CRYPTO_THREAD_lock_free(cc->lock);
CRYPTO_FREE_REF(&cc->references);
OPENSSL_free(cc);
}
int OSSL_COMP_CERT_up_ref(OSSL_COMP_CERT *cc)
{
int i;

if (CRYPTO_UP_REF(&cc->references, &i, cc->lock) <= 0)
if (CRYPTO_UP_REF(&cc->references, &i) <= 0)
return 0;

REF_PRINT_COUNT("OSSL_COMP_CERT", cc);
Expand Down
26 changes: 18 additions & 8 deletions ssl/ssl_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -707,13 +707,18 @@ int ossl_ssl_init(SSL *ssl, SSL_CTX *ctx, const SSL_METHOD *method, int type)
{
ssl->type = type;

ssl->references = 1;
ssl->lock = CRYPTO_THREAD_lock_new();
if (ssl->lock == NULL)
return 0;

if (!CRYPTO_NEW_REF(&ssl->references, 1)) {
CRYPTO_THREAD_lock_free(ssl->lock);
return 0;
}

if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, ssl, &ssl->ex_data)) {
CRYPTO_THREAD_lock_free(ssl->lock);
CRYPTO_FREE_REF(&ssl->references);
ssl->lock = NULL;
return 0;
}
Expand Down Expand Up @@ -969,7 +974,7 @@ int SSL_up_ref(SSL *s)
{
int i;

if (CRYPTO_UP_REF(&s->references, &i, s->lock) <= 0)
if (CRYPTO_UP_REF(&s->references, &i) <= 0)
return 0;

REF_PRINT_COUNT("SSL", s);
Expand Down Expand Up @@ -1374,7 +1379,7 @@ void SSL_free(SSL *s)

if (s == NULL)
return;
CRYPTO_DOWN_REF(&s->references, &i, s->lock);
CRYPTO_DOWN_REF(&s->references, &i);
REF_PRINT_COUNT("SSL", s);
if (i > 0)
return;
Expand All @@ -1387,6 +1392,7 @@ void SSL_free(SSL *s)

SSL_CTX_free(s->ctx);
CRYPTO_THREAD_lock_free(s->lock);
CRYPTO_FREE_REF(&s->references);

OPENSSL_free(s);
}
Expand Down Expand Up @@ -1974,7 +1980,7 @@ int SSL_copy_session_id(SSL *t, const SSL *f)
return 0;
}

CRYPTO_UP_REF(&fsc->cert->references, &i, fsc->cert->lock);
CRYPTO_UP_REF(&fsc->cert->references, &i);
ssl_cert_free(tsc->cert);
tsc->cert = fsc->cert;
if (!SSL_set_session_id_context(t, fsc->sid_ctx, (int)fsc->sid_ctx_length)) {
Expand Down Expand Up @@ -3779,12 +3785,15 @@ SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq,
ERR_raise(ERR_LIB_SSL, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
goto err;
}

ret = OPENSSL_zalloc(sizeof(*ret));
if (ret == NULL)
goto err;

/* Init the reference counting before any call to SSL_CTX_free */
ret->references = 1;
if (!CRYPTO_NEW_REF(&ret->references, 1))
goto err;

ret->lock = CRYPTO_THREAD_lock_new();
if (ret->lock == NULL) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
Expand Down Expand Up @@ -4029,7 +4038,7 @@ int SSL_CTX_up_ref(SSL_CTX *ctx)
{
int i;

if (CRYPTO_UP_REF(&ctx->references, &i, ctx->lock) <= 0)
if (CRYPTO_UP_REF(&ctx->references, &i) <= 0)
return 0;

REF_PRINT_COUNT("SSL_CTX", ctx);
Expand All @@ -4045,7 +4054,7 @@ void SSL_CTX_free(SSL_CTX *a)
if (a == NULL)
return;

CRYPTO_DOWN_REF(&a->references, &i, a->lock);
CRYPTO_DOWN_REF(&a->references, &i);
REF_PRINT_COUNT("SSL_CTX", a);
if (i > 0)
return;
Expand Down Expand Up @@ -4130,6 +4139,7 @@ void SSL_CTX_free(SSL_CTX *a)
OPENSSL_free(a->server_cert_type);

CRYPTO_THREAD_lock_free(a->lock);
CRYPTO_FREE_REF(&a->references);
#ifdef TSAN_REQUIRES_LOCKING
CRYPTO_THREAD_lock_free(a->tsan_lock);
#endif
Expand Down Expand Up @@ -4815,7 +4825,7 @@ SSL *SSL_dup(SSL *s)

/* If we're not quiescent, just up_ref! */
if (!SSL_in_init(s) || !SSL_in_before(s)) {
CRYPTO_UP_REF(&s->references, &i, s->lock);
CRYPTO_UP_REF(&s->references, &i);
return s;
}

Expand Down
3 changes: 0 additions & 3 deletions ssl/ssl_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,6 @@ struct ssl_session_st {
size_t ticket_appdata_len;
uint32_t flags;
SSL_CTX *owner;
CRYPTO_RWLOCK *lock;
};

/* Extended master secret support */
Expand Down Expand Up @@ -1965,7 +1964,6 @@ struct ossl_comp_cert_st {
size_t len;
size_t orig_len;
CRYPTO_REF_COUNT references;
CRYPTO_RWLOCK *lock;
int alg;
};
typedef struct ossl_comp_cert_st OSSL_COMP_CERT;
Expand Down Expand Up @@ -2107,7 +2105,6 @@ typedef struct cert_st {
char *psk_identity_hint;
# endif
CRYPTO_REF_COUNT references; /* >1 only if SSL_copy_session_id is used */
CRYPTO_RWLOCK *lock;
} CERT;

# define FP_ICC (int (*)(const void *,const void *))
Expand Down
20 changes: 6 additions & 14 deletions ssl/ssl_sess.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,20 +110,17 @@ SSL_SESSION *SSL_SESSION_new(void)
return NULL;

ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
ss->references = 1;
/* 5 minute timeout by default */
ss->timeout = ossl_seconds2time(60 * 5 + 4);
ss->time = ossl_time_now();
ssl_session_calculate_timeout(ss);
ss->lock = CRYPTO_THREAD_lock_new();
if (ss->lock == NULL) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
if (!CRYPTO_NEW_REF(&ss->references, 1)) {
OPENSSL_free(ss);
return NULL;
}

if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data)) {
CRYPTO_THREAD_lock_free(ss->lock);
CRYPTO_FREE_REF(&ss->references);
OPENSSL_free(ss);
return NULL;
}
Expand Down Expand Up @@ -174,13 +171,8 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
dest->next = NULL;
dest->owner = NULL;

dest->references = 1;

dest->lock = CRYPTO_THREAD_lock_new();
if (dest->lock == NULL) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
if (!CRYPTO_NEW_REF(&dest->references, 1))
goto err;
}

if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, dest, &dest->ex_data)) {
ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
Expand Down Expand Up @@ -821,7 +813,7 @@ void SSL_SESSION_free(SSL_SESSION *ss)

if (ss == NULL)
return;
CRYPTO_DOWN_REF(&ss->references, &i, ss->lock);
CRYPTO_DOWN_REF(&ss->references, &i);
REF_PRINT_COUNT("SSL_SESSION", ss);
if (i > 0)
return;
Expand All @@ -845,15 +837,15 @@ void SSL_SESSION_free(SSL_SESSION *ss)
#endif
OPENSSL_free(ss->ext.alpn_selected);
OPENSSL_free(ss->ticket_appdata);
CRYPTO_THREAD_lock_free(ss->lock);
CRYPTO_FREE_REF(&ss->references);
OPENSSL_clear_free(ss, sizeof(*ss));
}

int SSL_SESSION_up_ref(SSL_SESSION *ss)
{
int i;

if (CRYPTO_UP_REF(&ss->references, &i, ss->lock) <= 0)
if (CRYPTO_UP_REF(&ss->references, &i) <= 0)
return 0;

REF_PRINT_COUNT("SSL_SESSION", ss);
Expand Down

0 comments on commit 43a07d6

Please sign in to comment.