tests/softhsm-distrust-after.config
tests/softhsm-long-label.config
tests/softhsm-neg-no-key.config
+tests/softhsm-os-locking-ok.config
tests/softhsm-post-handshake-with-cert-pkcs11.config
tests/spki
tests/spki-abstract
NULL,
};
-static const struct ck_c_initialize_args no_thread_init_args = {
- NULL, NULL, NULL, NULL, CKF_LIBRARY_CANT_CREATE_OS_THREADS, NULL,
-};
-
static void pkcs11_provider_deinit(struct gnutls_pkcs11_provider_st *provider)
{
p11_kit_module_finalize(provider->module);
reserved = (char *)(p + sizeof("p11-kit:") - 1);
}
- /* First try with CKF_OS_LOCKING_OK, then fall back without it */
+ /* First try with CKF_LIBRARY_CANT_CREATE_OS_THREADS |
+ * CKF_OS_LOCKING_OK, then fall back without it */
args = default_init_args;
args.reserved = (void *)reserved;
rv = module->C_Initialize(&args);
- if (rv == CKR_CANT_LOCK) {
- args = no_thread_init_args;
- args.reserved = (void *)reserved;
- rv = module->C_Initialize(&args);
+ if (rv == CKR_NEED_TO_CREATE_THREADS || rv == CKR_CANT_LOCK) {
+ struct ck_c_initialize_args *pargs;
+ if (reserved) {
+ memset(&args, 0, sizeof(args));
+ args.reserved = (void *)reserved;
+ pargs = &args;
+ } else {
+ pargs = NULL;
+ }
+ rv = module->C_Initialize(pargs);
}
if (rv != CKR_OK) {
#define _DESTRUCTOR __attribute__((destructor))
#endif
+#define LOCK_FLAGS (CKF_LIBRARY_CANT_CREATE_OS_THREADS | CKF_OS_LOCKING_OK)
+
static CK_RV override_C_Initialize(void *args)
{
CK_C_INITIALIZE_ARGS *init_args = args;
static bool first = true;
- assert(init_args);
-
if (first) {
- assert(init_args->flags & CKF_OS_LOCKING_OK);
+ assert(init_args &&
+ (init_args->flags & LOCK_FLAGS) == LOCK_FLAGS);
first = false;
return CKR_CANT_LOCK;
} else {
- assert(!(init_args->flags & CKF_OS_LOCKING_OK));
+ assert(!init_args ||
+ (init_args->flags & LOCK_FLAGS) != LOCK_FLAGS);
}
return base_C_Initialize(args);