mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
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:
parent
9749a07a1d
commit
4fc4faa7a7
@ -71,6 +71,7 @@
|
||||
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/threads.h"
|
||||
#include "internal/x509_int.h"
|
||||
#include "x509_lcl.h"
|
||||
|
||||
@ -88,6 +89,7 @@ struct lookup_dir_entry_st {
|
||||
typedef struct lookup_dir_st {
|
||||
BUF_MEM *buffer;
|
||||
STACK_OF(BY_DIR_ENTRY) *dirs;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
} BY_DIR;
|
||||
|
||||
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;
|
||||
|
||||
if ((a = OPENSSL_malloc(sizeof(*a))) == NULL)
|
||||
return (0);
|
||||
return 0;
|
||||
if ((a->buffer = BUF_MEM_new()) == NULL) {
|
||||
OPENSSL_free(a);
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
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;
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
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;
|
||||
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
|
||||
BUF_MEM_free(a->buffer);
|
||||
CRYPTO_THREAD_lock_free(a->lock);
|
||||
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) {
|
||||
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);
|
||||
if (idx >= 0) {
|
||||
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;
|
||||
k = 0;
|
||||
}
|
||||
CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
} else {
|
||||
k = 0;
|
||||
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
|
||||
*/
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
j = sk_X509_OBJECT_find(xl->store_ctx->objs, &stmp);
|
||||
if (j != -1)
|
||||
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j);
|
||||
else
|
||||
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 (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
|
||||
* first.
|
||||
@ -388,7 +397,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
if (!hent) {
|
||||
hent = OPENSSL_malloc(sizeof(*hent));
|
||||
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);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
@ -396,15 +405,16 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
hent->hash = h;
|
||||
hent->suffix = k;
|
||||
if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
OPENSSL_free(hent);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
}
|
||||
} else if (hent->suffix < k)
|
||||
} else if (hent->suffix < k) {
|
||||
hent->suffix = k;
|
||||
}
|
||||
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user