aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDoug Hogan <[email protected]>2019-01-08 00:28:35 -0800
committerDoug Hogan <[email protected]>2019-01-08 01:11:57 -0800
commit24481a0cb35c3965ff498fa33f3d05763f49087e (patch)
tree62b66a6a07581480086d9c17aa29313392a6cbe6 /lib
parent12f1147428dc3160c50a6642aba96f01008eeb71 (diff)
downloadotp-24481a0cb35c3965ff498fa33f3d05763f49087e.tar.gz
otp-24481a0cb35c3965ff498fa33f3d05763f49087e.tar.bz2
otp-24481a0cb35c3965ff498fa33f3d05763f49087e.zip
Revamp non-EVP hash_init_nif()
Diffstat (limited to 'lib')
-rw-r--r--lib/crypto/c_src/hash.c29
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[])