diff options
author | Doug Hogan <[email protected]> | 2019-01-08 00:28:35 -0800 |
---|---|---|
committer | Doug Hogan <[email protected]> | 2019-01-08 01:11:57 -0800 |
commit | 24481a0cb35c3965ff498fa33f3d05763f49087e (patch) | |
tree | 62b66a6a07581480086d9c17aa29313392a6cbe6 /lib/crypto | |
parent | 12f1147428dc3160c50a6642aba96f01008eeb71 (diff) | |
download | otp-24481a0cb35c3965ff498fa33f3d05763f49087e.tar.gz otp-24481a0cb35c3965ff498fa33f3d05763f49087e.tar.bz2 otp-24481a0cb35c3965ff498fa33f3d05763f49087e.zip |
Revamp non-EVP hash_init_nif()
Diffstat (limited to 'lib/crypto')
-rw-r--r-- | lib/crypto/c_src/hash.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/lib/crypto/c_src/hash.c b/lib/crypto/c_src/hash.c index ee7a589b49..258f127b4a 100644 --- a/lib/crypto/c_src/hash.c +++ b/lib/crypto/c_src/hash.c @@ -218,14 +218,14 @@ ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ERL_NIF_TERM ctx; size_t ctx_size = 0; init_fun ctx_init = 0; + unsigned char *outp; - digp = get_digest_type(argv[0]); - if (!digp) { - return enif_make_badarg(env); - } - if (!digp->md.p) { - return atom_notsup; - } + if (argc != 1) + goto bad_arg; + if ((digp = get_digest_type(argv[0])) == NULL) + goto bad_arg; + if (digp->md.p == NULL) + goto err; switch (EVP_MD_type(digp->md.p)) { @@ -270,13 +270,24 @@ ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) break; #endif default: - return atom_notsup; + goto err; } ASSERT(ctx_size); ASSERT(ctx_init); - ctx_init(enif_make_new_binary(env, ctx_size, &ctx)); + if ((outp = enif_make_new_binary(env, ctx_size, &ctx)) == NULL) + goto err; + + if (ctx_init(outp) != 1) + goto err; + return enif_make_tuple2(env, argv[0], ctx); + + bad_arg: + return enif_make_badarg(env); + + err: + return atom_notsup; } ERL_NIF_TERM hash_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) |