Commit 03273d61 authored by Alessandro Ghedini's avatar Alessandro Ghedini Committed by Rich Salz
Browse files

Convert CRYPTO_LOCK_EVP_PKEY to new multi-threading API

parent fb46be03
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -72,8 +72,15 @@
static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
                     void *exarg)
{
    if (operation == ASN1_OP_NEW_POST) {
        X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
        pubkey->lock = CRYPTO_THREAD_lock_new();
        if (pubkey->lock == NULL)
            return 0;
    }
    if (operation == ASN1_OP_FREE_POST) {
        X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
        CRYPTO_THREAD_lock_free(pubkey->lock);
        EVP_PKEY_free(pubkey->pkey);
    }
    return 1;
@@ -155,14 +162,14 @@ EVP_PKEY *X509_PUBKEY_get0(X509_PUBKEY *key)
    }

    /* Check to see if another thread set key->pkey first */
    CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY);
    CRYPTO_THREAD_write_lock(key->lock);
    if (key->pkey) {
        CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
        CRYPTO_THREAD_unlock(key->lock);
        EVP_PKEY_free(ret);
        ret = key->pkey;
    } else {
        key->pkey = ret;
        CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY);
        CRYPTO_THREAD_unlock(key->lock);
    }

    return ret;
+2 −1
Original line number Diff line number Diff line
@@ -200,7 +200,8 @@ static int cms_RecipientInfo_ktri_init(CMS_RecipientInfo *ri, X509 *recip,
        return 0;

    X509_up_ref(recip);
    CRYPTO_add(&pk->references, 1, CRYPTO_LOCK_EVP_PKEY);
    EVP_PKEY_up_ref(pk);

    ktri->pkey = pk;
    ktri->recip = recip;

+1 −1
Original line number Diff line number Diff line
@@ -283,8 +283,8 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
    /* Call for side-effect of computing hash and caching extensions */
    X509_check_purpose(signer, -1, -1);

    CRYPTO_add(&pk->references, 1, CRYPTO_LOCK_EVP_PKEY);
    X509_up_ref(signer);
    EVP_PKEY_up_ref(pk);

    si->pkey = pk;
    si->signer = signer;
+12 −4
Original line number Diff line number Diff line
@@ -190,18 +190,25 @@ EVP_PKEY *EVP_PKEY_new(void)

    if (ret == NULL) {
        EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
        return (NULL);
        return NULL;
    }
    ret->type = EVP_PKEY_NONE;
    ret->save_type = EVP_PKEY_NONE;
    ret->references = 1;
    ret->save_parameters = 1;
    return (ret);
    ret->lock = CRYPTO_THREAD_lock_new();
    if (ret->lock == NULL) {
        EVPerr(EVP_F_EVP_PKEY_NEW, ERR_R_MALLOC_FAILURE);
        OPENSSL_free(ret);
        return NULL;
    }
    return ret;
}

void EVP_PKEY_up_ref(EVP_PKEY *pkey)
{
    CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
    int i;
    CRYPTO_atomic_add(&pkey->references, 1, &i, pkey->lock);
}

/*
@@ -416,7 +423,7 @@ void EVP_PKEY_free(EVP_PKEY *x)
    if (x == NULL)
        return;

    i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_EVP_PKEY);
    CRYPTO_atomic_add(&x->references, -1, &i, x->lock);
    REF_PRINT_COUNT("EVP_PKEY", x);
    if (i > 0)
        return;
@@ -437,6 +444,7 @@ static void EVP_PKEY_free_it(EVP_PKEY *x)
    ENGINE_finish(x->engine);
    x->engine = NULL;
#endif
    CRYPTO_THREAD_lock_free(x->lock);
}

static int unsup_alg(BIO *out, const EVP_PKEY *pkey, int indent,
+1 −1
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer)
        return ret;
    }

    CRYPTO_add(&peer->references, 1, CRYPTO_LOCK_EVP_PKEY);
    EVP_PKEY_up_ref(peer);
    return 1;
}

Loading