aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Hogan <[email protected]>2019-01-03 21:25:30 -0800
committerDoug Hogan <[email protected]>2019-01-08 01:11:57 -0800
commitc94b99aea4c7aaa296153c038117c9360a57ff50 (patch)
tree12c611cb7bb593c4bf462393bf7d95326916f587
parentb645e20dac3b5c228316abde02bd7dedfd6bcf59 (diff)
downloadotp-c94b99aea4c7aaa296153c038117c9360a57ff50.tar.gz
otp-c94b99aea4c7aaa296153c038117c9360a57ff50.tar.bz2
otp-c94b99aea4c7aaa296153c038117c9360a57ff50.zip
Revamp engine_get_next_nif()
* Add error handling for all Erlang calls.
-rw-r--r--lib/crypto/c_src/engine.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/crypto/c_src/engine.c b/lib/crypto/c_src/engine.c
index 4cbb8dc683..5067f34eec 100644
--- a/lib/crypto/c_src/engine.c
+++ b/lib/crypto/c_src/engine.c
@@ -613,31 +613,41 @@ ERL_NIF_TERM engine_get_first_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
ERL_NIF_TERM engine_get_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (Engine) */
#ifdef HAS_ENGINE_SUPPORT
- ERL_NIF_TERM ret;
+ ERL_NIF_TERM ret, result;
ENGINE *engine;
ErlNifBinary engine_bin;
- struct engine_ctx *ctx, *next_ctx;
+ struct engine_ctx *ctx, *next_ctx = NULL;
// Get Engine
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)) {
- PRINTF_ERR0("engine_get_next_nif Leaved: Parameter not an engine resource object");
- return enif_make_badarg(env);
- }
- engine = ENGINE_get_next(ctx->engine);
- if (!engine) {
- enif_alloc_binary(0, &engine_bin);
+ if (argc != 1)
+ goto bad_arg;
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
+ goto bad_arg;
+
+ if ((engine = ENGINE_get_next(ctx->engine)) == NULL) {
+ if (!enif_alloc_binary(0, &engine_bin))
+ goto err;
engine_bin.size = 0;
return enif_make_tuple2(env, atom_ok, enif_make_binary(env, &engine_bin));
}
- next_ctx = enif_alloc_resource(engine_ctx_rtype, sizeof(struct engine_ctx));
+ if ((next_ctx = enif_alloc_resource(engine_ctx_rtype, sizeof(struct engine_ctx))) == NULL)
+ goto err;
next_ctx->engine = engine;
next_ctx->id = NULL;
- ret = enif_make_resource(env, next_ctx);
+ result = enif_make_resource(env, next_ctx);
+ ret = enif_make_tuple2(env, atom_ok, result);
+ goto done;
+
+ bad_arg:
+ err:
+ ret = enif_make_badarg(env);
+
+ done:
enif_release_resource(next_ctx);
+ return ret;
- return enif_make_tuple2(env, atom_ok, ret);
#else
return atom_notsup;
#endif