summaryrefslogtreecommitdiff
path: root/lib/crypto/c_src/engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/crypto/c_src/engine.c')
-rw-r--r--lib/crypto/c_src/engine.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/lib/crypto/c_src/engine.c b/lib/crypto/c_src/engine.c
index b2fdcfaa9f..82ba50e4bd 100644
--- a/lib/crypto/c_src/engine.c
+++ b/lib/crypto/c_src/engine.c
@@ -23,6 +23,7 @@
#ifdef HAS_ENGINE_SUPPORT
struct engine_ctx {
ENGINE *engine;
+ int is_functional;
char *id;
};
@@ -44,6 +45,12 @@ static void engine_ctx_dtor(ErlNifEnv* env, struct engine_ctx* ctx) {
enif_free(ctx->id);
} else
PRINTF_ERR0(" empty ctx->id=NULL");
+
+ if (ctx->engine) {
+ if (ctx->is_functional)
+ ENGINE_finish(ctx->engine);
+ ENGINE_free(ctx->engine);
+ }
}
int get_engine_and_key_id(ErlNifEnv *env, ERL_NIF_TERM key, char ** id, ENGINE **e)
@@ -144,6 +151,7 @@ ERL_NIF_TERM engine_by_id_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
if ((ctx = enif_alloc_resource(engine_ctx_rtype, sizeof(struct engine_ctx))) == NULL)
goto err;
ctx->engine = engine;
+ ctx->is_functional = 0;
ctx->id = engine_id;
/* ctx now owns engine_id */
engine_id = NULL;
@@ -181,7 +189,7 @@ ERL_NIF_TERM engine_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
if (!ENGINE_init(ctx->engine))
return ERROR_Atom(env, "engine_init_failed");
-
+ ctx->is_functional = 1;
return atom_ok;
bad_arg:
@@ -200,11 +208,13 @@ 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))
+ 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:
@@ -223,11 +233,13 @@ ERL_NIF_TERM engine_finish_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))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->is_functional)
goto bad_arg;
if (!ENGINE_finish(ctx->engine))
goto err;
+ ctx->is_functional = 0;
return atom_ok;
bad_arg:
@@ -265,7 +277,8 @@ ERL_NIF_TERM engine_ctrl_cmd_strings_nif(ErlNifEnv* env, int argc, const ERL_NIF
// Get Engine
ASSERT(argc == 3);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
PRINTF_ERR1("Engine Id: %s\r\n", ENGINE_get_id(ctx->engine));
@@ -333,7 +346,8 @@ ERL_NIF_TERM engine_add_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))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if (!ENGINE_add(ctx->engine))
@@ -360,7 +374,8 @@ ERL_NIF_TERM engine_remove_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))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if (!ENGINE_remove(ctx->engine))
@@ -387,7 +402,8 @@ ERL_NIF_TERM engine_register_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
// Get Engine
ASSERT(argc == 2);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if (!enif_get_uint(env, argv[1], &method))
goto bad_arg;
@@ -492,7 +508,8 @@ ERL_NIF_TERM engine_unregister_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
// Get Engine
ASSERT(argc == 2);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if (!enif_get_uint(env, argv[1], &method))
goto bad_arg;
@@ -592,6 +609,7 @@ ERL_NIF_TERM engine_get_first_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
if ((ctx = enif_alloc_resource(engine_ctx_rtype, sizeof(struct engine_ctx))) == NULL)
goto err;
+ ctx->is_functional = 0;
ctx->engine = engine;
ctx->id = NULL;
@@ -623,10 +641,14 @@ ERL_NIF_TERM engine_get_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
// Get Engine
ASSERT(argc == 1);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
- if ((engine = ENGINE_get_next(ctx->engine)) == NULL) {
+ engine = ENGINE_get_next(ctx->engine);
+ ctx->engine = NULL;
+
+ if (engine == NULL) {
if (!enif_alloc_binary(0, &engine_bin))
goto err;
engine_bin.size = 0;
@@ -636,6 +658,7 @@ ERL_NIF_TERM engine_get_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
if ((next_ctx = enif_alloc_resource(engine_ctx_rtype, sizeof(struct engine_ctx))) == NULL)
goto err;
next_ctx->engine = engine;
+ next_ctx->is_functional = 0;
next_ctx->id = NULL;
result = enif_make_resource(env, next_ctx);
@@ -667,7 +690,8 @@ ERL_NIF_TERM engine_get_id_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))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if ((engine_id = ENGINE_get_id(ctx->engine)) == NULL) {
@@ -705,7 +729,8 @@ ERL_NIF_TERM engine_get_name_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
// Get Engine
ASSERT(argc == 1);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
+ || !ctx->engine)
goto bad_arg;
if ((engine_name = ENGINE_get_name(ctx->engine)) == NULL) {