Commit 4fc4faa7 authored by Matt Caswell's avatar Matt Caswell
Browse files

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: default avatarRichard Levitte <levitte@openssl.org>
parent 9749a07a
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line
@@ -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);

        }