Commit e019da7b authored by Richard Levitte's avatar Richard Levitte
Browse files

Fix the generic EVP algorithm fetch to actually cache them



ossl_method_store_cache_get() and ossl_method_store_cache_set() were
called with a NULL argument for store, which means no caching is
done.  Give them a real store instead.

Also, increment the refcount when we do get a method out of the cache.

Reviewed-by: default avatarPaul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8781)
parent 4f29f3a2
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -173,11 +173,15 @@ void *evp_generic_fetch(OPENSSL_CTX *libctx, int operation_id,
                        void (*free_method)(void *),
                        int (*nid_method)(void *))
{
    OSSL_METHOD_STORE *store = get_default_method_store(libctx);
    int nid = OBJ_sn2nid(algorithm);
    void *method = NULL;

    if (store == NULL)
        return NULL;

    if (nid == NID_undef
        || !ossl_method_store_cache_get(NULL, nid, properties, &method)) {
        || !ossl_method_store_cache_get(store, nid, properties, &method)) {
        OSSL_METHOD_CONSTRUCT_METHOD mcm = {
            alloc_tmp_method_store,
            dealloc_tmp_method_store,
@@ -198,7 +202,9 @@ void *evp_generic_fetch(OPENSSL_CTX *libctx, int operation_id,
        method = ossl_method_construct(libctx, operation_id, algorithm,
                                       properties, 0 /* !force_cache */,
                                       &mcm, &mcmdata);
        ossl_method_store_cache_set(NULL, nid, properties, method);
        ossl_method_store_cache_set(store, nid, properties, method);
    } else {
        upref_method(method);
    }

    return method;