File 2321-crypto-Remove-engine_finish_nif.patch of Package erlang

From 49e0293ef76674f8bab721359cce1be2f456d541 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 12 Aug 2021 19:53:43 +0200
Subject: [PATCH 1/2] crypto: Remove engine_finish_nif

and let engine_free_nif do ENGINE_finish if necessary.

This assumes we never want to do finish without free or vice versa.
---
 lib/crypto/c_src/crypto.c |  1 -
 lib/crypto/c_src/engine.c | 49 ++++++++++++++-------------------------
 lib/crypto/src/crypto.erl |  9 +++----
 3 files changed, 21 insertions(+), 38 deletions(-)

diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 5c0a1ccf6a..16d1e3a020 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -111,7 +111,6 @@ static ErlNifFunc nif_funcs[] = {
 
     {"engine_by_id_nif", 1, engine_by_id_nif, 0},
     {"engine_init_nif", 1, engine_init_nif, 0},
-    {"engine_finish_nif", 1, engine_finish_nif, 0},
     {"engine_free_nif", 1, engine_free_nif, 0},
     {"engine_load_dynamic_nif", 0, engine_load_dynamic_nif, 0},
     {"engine_ctrl_cmd_strings_nif", 3, engine_ctrl_cmd_strings_nif, 0},
diff --git a/lib/crypto/c_src/engine.c b/lib/crypto/c_src/engine.c
index 82ba50e4bd..263acd483d 100644
--- a/lib/crypto/c_src/engine.c
+++ b/lib/crypto/c_src/engine.c
@@ -208,44 +208,27 @@ ERL_NIF_TERM engine_free_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
     // Get Engine
     ASSERT(argc == 1);
 
-    if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
-        || ctx->is_functional)
-        goto bad_arg;
-
-    if (!ENGINE_free(ctx->engine))
-        goto err;
-    ctx->engine = NULL;
-    return atom_ok;
-
- bad_arg:
- err:
-    return enif_make_badarg(env);
-#else
-    return atom_notsup;
-#endif
-}
-
-ERL_NIF_TERM engine_finish_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{/* (Engine) */
-#ifdef HAS_ENGINE_SUPPORT
-    struct engine_ctx *ctx;
-
-    // Get Engine
-    ASSERT(argc == 1);
-
-    if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
-        || !ctx->is_functional)
+    if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
         goto bad_arg;
 
-    if (!ENGINE_finish(ctx->engine))
-        goto err;
-    ctx->is_functional = 0;
+    if (ctx->engine) {
+        if (ctx->is_functional) {
+            if (!ENGINE_finish(ctx->engine))
+                goto err;
+            ctx->is_functional = 0;
+        }
+        if (!ENGINE_free(ctx->engine))
+            goto err;
+        ctx->engine = NULL;
+    }
+    else {
+        ASSERT(!ctx->is_functional);
+    }
     return atom_ok;
 
  bad_arg:
  err:
     return enif_make_badarg(env);
-
 #else
     return atom_notsup;
 #endif
@@ -645,6 +628,10 @@ ERL_NIF_TERM engine_get_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
         || !ctx->engine)
         goto bad_arg;
 
+    if (ctx->is_functional) {
+        ENGINE_finish(ctx->engine);
+        ctx->is_functional = 0;
+    }
     engine = ENGINE_get_next(ctx->engine);
     ctx->engine = NULL;
 
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index d917caeae9..a30b6b095c 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -1781,7 +1781,7 @@ engine_load_2(Engine, PostCmds, EngineMethods) ->
     catch
        throw:Error ->
           %% The engine registration failed, release the functional reference
-          ok = engine_finish_nif(Engine),
+          ok = engine_free_nif(Engine),
           throw(Error)
     end.
 
@@ -1800,9 +1800,7 @@ engine_unload(Engine, EngineMethods) ->
     try
         [ok = engine_nif_wrapper(engine_unregister_nif(Engine, engine_method_atom_to_int(Method))) ||
             Method <- EngineMethods],
-        %% Release the functional reference from engine_init_nif
-        ok = engine_nif_wrapper(engine_finish_nif(Engine)),
-        %% Release the structural reference from engine_by_id_nif
+        %% Release the reference from engine_by_id_nif
         ok = engine_nif_wrapper(engine_free_nif(Engine))
     catch
        throw:Error ->
@@ -1981,7 +1979,7 @@ ensure_engine_loaded_2(Engine, Methods) ->
     catch
        throw:Error ->
           %% The engine registration failed, release the functional reference
-          ok = engine_finish_nif(Engine),
+          ok = engine_free_nif(Engine),
           throw(Error)
     end.
 %%----------------------------------------------------------------------
@@ -2395,7 +2393,6 @@ packed_openssl_version(MAJ, MIN, FIX, P0) ->
 %% Engine nifs
 engine_by_id_nif(_EngineId) -> ?nif_stub.
 engine_init_nif(_Engine) -> ?nif_stub.
-engine_finish_nif(_Engine) -> ?nif_stub.
 engine_free_nif(_Engine) -> ?nif_stub.
 engine_load_dynamic_nif() -> ?nif_stub.
 engine_ctrl_cmd_strings_nif(_Engine, _Cmds, _Optional) -> ?nif_stub.
-- 
2.31.1

openSUSE Build Service is sponsored by