Ref count: change to use wolfSSL_Ref
Data structures changed: WOLFSSL_CERT_MANAGER, WOLFSSL_CTX, WOLFSSL_SESSION, WOLFSSL_X509, WOLFSSL_X509, WOLFSSL_EVP_PKEY, WOLFSSL_BIO, WOLFSSL_X509_STORE
This commit is contained in:
@@ -9338,15 +9338,11 @@ WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_EVP_PKEY2PKCS8(const WOLFSSL_EVP_PKEY* pkey
|
||||
int wolfSSL_EVP_PKEY_up_ref(WOLFSSL_EVP_PKEY* pkey)
|
||||
{
|
||||
if (pkey) {
|
||||
#ifndef SINGLE_THREADED
|
||||
if (wc_LockMutex(&pkey->refMutex) != 0) {
|
||||
int ret;
|
||||
wolfSSL_RefInc(&pkey->ref, &ret);
|
||||
if (ret != 0) {
|
||||
WOLFSSL_MSG("Failed to lock pkey mutex");
|
||||
}
|
||||
#endif
|
||||
pkey->references++;
|
||||
#ifndef SINGLE_THREADED
|
||||
wc_UnLockMutex(&pkey->refMutex);
|
||||
#endif
|
||||
|
||||
return WOLFSSL_SUCCESS;
|
||||
}
|
||||
@@ -9444,27 +9440,24 @@ WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap)
|
||||
pkey->heap = heap;
|
||||
pkey->type = WOLFSSL_EVP_PKEY_DEFAULT;
|
||||
|
||||
#ifndef SINGLE_THREADED
|
||||
/* init of mutex needs to come before wolfSSL_EVP_PKEY_free */
|
||||
ret = wc_InitMutex(&pkey->refMutex);
|
||||
if (ret != 0){
|
||||
XFREE(pkey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
|
||||
WOLFSSL_MSG("Issue initializing mutex");
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FIPS
|
||||
ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID);
|
||||
#else
|
||||
ret = wc_InitRng(&pkey->rng);
|
||||
#endif
|
||||
pkey->references = 1;
|
||||
if (ret != 0){
|
||||
wolfSSL_EVP_PKEY_free(pkey);
|
||||
WOLFSSL_MSG("Issue initializing RNG");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wolfSSL_RefInit(&pkey->ref, &ret);
|
||||
if (ret != 0){
|
||||
wolfSSL_EVP_PKEY_free(pkey);
|
||||
WOLFSSL_MSG("Issue initializing mutex");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
WOLFSSL_MSG("memory failure");
|
||||
@@ -9478,20 +9471,11 @@ void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
|
||||
int doFree = 0;
|
||||
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free");
|
||||
if (key != NULL) {
|
||||
#ifndef SINGLE_THREADED
|
||||
if (wc_LockMutex(&key->refMutex) != 0) {
|
||||
int ret;
|
||||
wolfSSL_RefDec(&key->ref, &doFree, &ret);
|
||||
if (ret != 0) {
|
||||
WOLFSSL_MSG("Couldn't lock pkey mutex");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* only free if all references to it are done */
|
||||
key->references--;
|
||||
if (key->references == 0) {
|
||||
doFree = 1;
|
||||
}
|
||||
#ifndef SINGLE_THREADED
|
||||
wc_UnLockMutex(&key->refMutex);
|
||||
#endif
|
||||
|
||||
if (doFree) {
|
||||
wc_FreeRng(&key->rng);
|
||||
@@ -9573,11 +9557,7 @@ void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifndef SINGLE_THREADED
|
||||
if (wc_FreeMutex(&key->refMutex) != 0) {
|
||||
WOLFSSL_MSG("Couldn't free pkey mutex");
|
||||
}
|
||||
#endif
|
||||
wolfSSL_RefFree(&key->ref);
|
||||
XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1100,7 +1100,9 @@ void wolfSSL_RefDec(wolfSSL_Ref* ref, int* isZero, int* err)
|
||||
WOLFSSL_MSG("Failed to lock mutex for reference decrement!");
|
||||
}
|
||||
else {
|
||||
ref->count--;
|
||||
if (ref->count > 0) {
|
||||
ref->count--;
|
||||
}
|
||||
*isZero = (ref->count == 0);
|
||||
wc_UnLockMutex(&ref->mutex);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user