static void parser_country_start (MobileParser *parser, const char *name, const char **attribute_names, const char **attribute_values) { if (!strcmp (name, "provider")) { parser->state = PARSER_PROVIDER; parser->current_provider = provider_new (); } }
OSSL_PROVIDER *ossl_provider_new(OPENSSL_CTX *libctx, const char *name, OSSL_provider_init_fn *init_function) { struct provider_store_st *store = NULL; OSSL_PROVIDER *prov = NULL; if ((store = get_provider_store(libctx)) == NULL) return NULL; if ((prov = ossl_provider_find(libctx, name)) != NULL) { /* refcount +1 */ ossl_provider_free(prov); /* refcount -1 */ CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_NEW, CRYPTO_R_PROVIDER_ALREADY_EXISTS); ERR_add_error_data(2, "name=", name); return NULL; } /* provider_new() generates an error, so no need here */ if ((prov = provider_new(name, init_function)) == NULL) return NULL; CRYPTO_THREAD_write_lock(store->lock); if (!ossl_provider_upref(prov)) { /* +1 One reference for the store */ ossl_provider_free(prov); /* -1 Reference that was to be returned */ prov = NULL; } else if (sk_OSSL_PROVIDER_push(store->providers, prov) == 0) { ossl_provider_free(prov); /* -1 Store reference */ ossl_provider_free(prov); /* -1 Reference that was to be returned */ prov = NULL; } else { prov->store = store; } CRYPTO_THREAD_unlock(store->lock); if (prov == NULL) CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_NEW, ERR_R_MALLOC_FAILURE); /* * At this point, the provider is only partially "loaded". To be * fully "loaded", ossl_provider_activate() must also be called. */ return prov; }
static void *provider_store_new(void) { struct provider_store_st *store = OPENSSL_zalloc(sizeof(*store)); const struct predefined_providers_st *p = NULL; if (store == NULL || (store->providers = sk_OSSL_PROVIDER_new(ossl_provider_cmp)) == NULL || (store->lock = CRYPTO_THREAD_lock_new()) == NULL) { provider_store_free(store); return NULL; } store->use_fallbacks = 1; for (p = predefined_providers; p->name != NULL; p++) { OSSL_PROVIDER *prov = NULL; /* * We use the internal constructor directly here, * otherwise we get a call loop */ prov = provider_new(p->name, p->init); if (prov == NULL || sk_OSSL_PROVIDER_push(store->providers, prov) == 0) { ossl_provider_free(prov); provider_store_free(store); CRYPTOerr(CRYPTO_F_PROVIDER_STORE_NEW, ERR_R_INTERNAL_ERROR); return NULL; } prov->store = store; if(p->is_fallback) ossl_provider_set_fallback(prov); } return store; }