*/
unsigned char *operation_bits;
size_t operation_bits_sz;
+ CRYPTO_RWLOCK *opbits_lock;
/* Provider side data */
void *provctx;
|| (prov->activatecnt_lock = CRYPTO_THREAD_lock_new()) == NULL
#endif
|| !ossl_provider_up_ref(prov) /* +1 One reference to be returned */
+ || (prov->opbits_lock = CRYPTO_THREAD_lock_new()) == NULL
|| (prov->name = OPENSSL_strdup(name)) == NULL) {
ossl_provider_free(prov);
ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE);
OPENSSL_free(prov->name);
OPENSSL_free(prov->path);
sk_INFOPAIR_pop_free(prov->parameters, free_infopair);
+ CRYPTO_THREAD_lock_free(prov->opbits_lock);
#ifndef HAVE_ATOMICS
CRYPTO_THREAD_lock_free(prov->refcnt_lock);
CRYPTO_THREAD_lock_free(prov->activatecnt_lock);
size_t byte = bitnum / 8;
unsigned char bit = (1 << (bitnum % 8)) & 0xFF;
+ CRYPTO_THREAD_write_lock(provider->opbits_lock);
if (provider->operation_bits_sz <= byte) {
unsigned char *tmp = OPENSSL_realloc(provider->operation_bits,
byte + 1);
if (tmp == NULL) {
+ CRYPTO_THREAD_unlock(provider->opbits_lock);
ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE);
return 0;
}
provider->operation_bits_sz = byte + 1;
}
provider->operation_bits[byte] |= bit;
+ CRYPTO_THREAD_unlock(provider->opbits_lock);
return 1;
}
}
*result = 0;
+ CRYPTO_THREAD_read_lock(provider->opbits_lock);
if (provider->operation_bits_sz > byte)
*result = ((provider->operation_bits[byte] & bit) != 0);
+ CRYPTO_THREAD_unlock(provider->opbits_lock);
return 1;
}