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