Remove use of the old CRYPTO_LOCK_X5O9_STORE

The locking here is a bit strange and unclear. Rather than refactor
anything and possibly break stuff I have just moved to using the new
thread API following as closely as possible what was there previously.

Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
Matt Caswell 2016-03-09 09:52:39 +00:00
parent 9749a07a1d
commit 4fc4faa7a7

View File

@ -71,6 +71,7 @@
#include <openssl/lhash.h> #include <openssl/lhash.h>
#include <openssl/x509.h> #include <openssl/x509.h>
#include "internal/threads.h"
#include "internal/x509_int.h" #include "internal/x509_int.h"
#include "x509_lcl.h" #include "x509_lcl.h"
@ -88,6 +89,7 @@ struct lookup_dir_entry_st {
typedef struct lookup_dir_st { typedef struct lookup_dir_st {
BUF_MEM *buffer; BUF_MEM *buffer;
STACK_OF(BY_DIR_ENTRY) *dirs; STACK_OF(BY_DIR_ENTRY) *dirs;
CRYPTO_RWLOCK *lock;
} BY_DIR; } BY_DIR;
static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
@ -148,14 +150,20 @@ static int new_dir(X509_LOOKUP *lu)
BY_DIR *a; BY_DIR *a;
if ((a = OPENSSL_malloc(sizeof(*a))) == NULL) if ((a = OPENSSL_malloc(sizeof(*a))) == NULL)
return (0); return 0;
if ((a->buffer = BUF_MEM_new()) == NULL) { if ((a->buffer = BUF_MEM_new()) == NULL) {
OPENSSL_free(a); OPENSSL_free(a);
return (0); return 0;
} }
a->dirs = NULL; a->dirs = NULL;
a->lock = CRYPTO_THREAD_lock_new();
if (a->lock == NULL) {
BUF_MEM_free(a->buffer);
OPENSSL_free(a);
return 0;
}
lu->method_data = (char *)a; lu->method_data = (char *)a;
return (1); return 1;
} }
static void by_dir_hash_free(BY_DIR_HASH *hash) static void by_dir_hash_free(BY_DIR_HASH *hash)
@ -187,6 +195,7 @@ static void free_dir(X509_LOOKUP *lu)
a = (BY_DIR *)lu->method_data; a = (BY_DIR *)lu->method_data;
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free); sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
BUF_MEM_free(a->buffer); BUF_MEM_free(a->buffer);
CRYPTO_THREAD_lock_free(a->lock);
OPENSSL_free(a); OPENSSL_free(a);
} }
@ -297,7 +306,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
} }
if (type == X509_LU_CRL && ent->hashes) { if (type == X509_LU_CRL && ent->hashes) {
htmp.hash = h; htmp.hash = h;
CRYPTO_r_lock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_read_lock(ctx->lock);
idx = sk_BY_DIR_HASH_find(ent->hashes, &htmp); idx = sk_BY_DIR_HASH_find(ent->hashes, &htmp);
if (idx >= 0) { if (idx >= 0) {
hent = sk_BY_DIR_HASH_value(ent->hashes, idx); hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
@ -306,7 +315,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
hent = NULL; hent = NULL;
k = 0; k = 0;
} }
CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_unlock(ctx->lock);
} else { } else {
k = 0; k = 0;
hent = NULL; hent = NULL;
@ -363,18 +372,18 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
/* /*
* we have added it to the cache so now pull it out again * we have added it to the cache so now pull it out again
*/ */
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_write_lock(ctx->lock);
j = sk_X509_OBJECT_find(xl->store_ctx->objs, &stmp); j = sk_X509_OBJECT_find(xl->store_ctx->objs, &stmp);
if (j != -1) if (j != -1)
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j); tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j);
else else
tmp = NULL; tmp = NULL;
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_unlock(ctx->lock);
/* If a CRL, update the last file suffix added for this */ /* If a CRL, update the last file suffix added for this */
if (type == X509_LU_CRL) { if (type == X509_LU_CRL) {
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_write_lock(ctx->lock);
/* /*
* Look for entry again in case another thread added an entry * Look for entry again in case another thread added an entry
* first. * first.
@ -388,7 +397,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
if (!hent) { if (!hent) {
hent = OPENSSL_malloc(sizeof(*hent)); hent = OPENSSL_malloc(sizeof(*hent));
if (hent == NULL) { if (hent == NULL) {
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_unlock(ctx->lock);
X509err(X509_F_GET_CERT_BY_SUBJECT, ERR_R_MALLOC_FAILURE); X509err(X509_F_GET_CERT_BY_SUBJECT, ERR_R_MALLOC_FAILURE);
ok = 0; ok = 0;
goto finish; goto finish;
@ -396,15 +405,16 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
hent->hash = h; hent->hash = h;
hent->suffix = k; hent->suffix = k;
if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) { if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_unlock(ctx->lock);
OPENSSL_free(hent); OPENSSL_free(hent);
ok = 0; ok = 0;
goto finish; goto finish;
} }
} else if (hent->suffix < k) } else if (hent->suffix < k) {
hent->suffix = k; hent->suffix = k;
}
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); CRYPTO_THREAD_unlock(ctx->lock);
} }