File 8651-crypto-pbkdf2_hmac-5-error-ERR-error-ERR-FileInfo-De.patch of Package erlang

From 814234aa91b52b744bb7251b15a6e4b19df4e05d Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Tue, 8 Mar 2022 11:30:35 +0100
Subject: [PATCH 1/8] crypto:pbkdf2_hmac/5:  error:ERR ->
 error:{ERR,FileInfo,Description}

---
 lib/crypto/c_src/common.h      |  2 ++
 lib/crypto/c_src/pbkdf2_hmac.c | 36 +++++++++++++++-------------------
 lib/crypto/doc/src/crypto.xml  |  4 +---
 lib/crypto/src/crypto.erl      |  2 +-
 4 files changed, 20 insertions(+), 24 deletions(-)

diff --git a/lib/crypto/c_src/common.h b/lib/crypto/c_src/common.h
index 593a58373f..911652b023 100644
--- a/lib/crypto/c_src/common.h
+++ b/lib/crypto/c_src/common.h
@@ -46,4 +46,6 @@ ERL_NIF_TERM raise_exception(ErlNifEnv* env, ERL_NIF_TERM id, int arg_num, char*
 #define EXCP_NOTSUP_N(Env, ArgNum, Str) raise_exception((Env), atom_notsup, (ArgNum), (Str), __FILE__, __LINE__)
 #define EXCP_BADARG_N(Env, ArgNum, Str) raise_exception((Env), atom_badarg, (ArgNum), (Str), __FILE__, __LINE__)
 
+#define assign_goto(Var, Goto, CALL) {Var = (CALL); goto Goto;}
+
 #endif /* E_COMMON_H__ */
diff --git a/lib/crypto/c_src/pbkdf2_hmac.c b/lib/crypto/c_src/pbkdf2_hmac.c
index 7eec603d9c..461932eba7 100644
--- a/lib/crypto/c_src/pbkdf2_hmac.c
+++ b/lib/crypto/c_src/pbkdf2_hmac.c
@@ -30,43 +30,38 @@ static ERL_NIF_TERM pbkdf2_hmac(ErlNifEnv* env, int argc,
     ErlNifUInt64 iter, keylen;
     struct digest_type_t* digp = NULL;
 
-    ASSERT(argc == 5);
-
     if ((digp = get_digest_type(argv[0])) == NULL)
-        goto bad_arg;
+        return EXCP_BADARG_N(env, 0, "Bad digest type");
     if (digp->md.p == NULL)
-        goto bad_arg;
-    if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0) {
-        goto bad_arg;
-    }
+        return EXCP_BADARG_N(env, 0, "md.p is not NULL");
+    if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0)
+        return EXCP_BADARG_N(env, 0, "Not eligible digest type");
 
     if (!enif_inspect_binary(env, argv[1], &pass))
-        goto bad_arg;
+        return EXCP_BADARG_N(env, 1, "Not binary");
+
     if (!enif_inspect_binary(env, argv[2], &salt))
-        goto bad_arg;
+        return EXCP_BADARG_N(env, 2, "Not binary");
 
     /* We already checked iter<0 and keylen<0 in pbkdf2_hmac_nif */
     if (!enif_get_uint64(env, argv[3], &iter))
-        goto bad_arg;
+        return EXCP_BADARG_N(env, 3, "Not integer");
 
     if (!enif_get_uint64(env, argv[4], &keylen))
-        goto bad_arg;
+        return EXCP_BADARG_N(env, 4, "Not integer");
 
     if (!enif_alloc_binary(keylen, &out))
-        goto err;
+        return EXCP_ERROR(env, "Can't allocate binary");
 
     if (!PKCS5_PBKDF2_HMAC((const char *)pass.data, pass.size,
                            salt.data, salt.size, iter,
                            digp->md.p,
                            keylen, out.data)) {
         enif_release_binary(&out);
-        goto err;
+        return EXCP_ERROR(env, "Low-level call failed");
     }
 
     return enif_make_binary(env, &out);
- bad_arg:
- err:
-    return enif_make_badarg(env);
 }
 #endif /* HAS_PKCS5_PBKDF2_HMAC */
 
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index c4cde105c6..34abbfa279 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -1982,12 +1982,10 @@ FloatValue = rand:uniform().     % again
       <name name="pbkdf2_hmac" arity="5" since="OTP 24.2"/>
       <fsummary>PBKDF2 in combination with HMAC</fsummary>
       <desc>
+	<p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
         <p>
           PKCS #5 PBKDF2 (Password-Based Key Derivation Function 2) in combination with HMAC.
         </p>
-        <p>
-          The function raises a <c>error:badarg</c> if the parameters are in wrong format.
-        </p>
       </desc>
     </func>
 
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index d9627b2f6f..9d54849ee6 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -580,7 +580,7 @@ enable_fips_mode_nif(_) -> ?nif_stub.
                KeyLen :: pos_integer(),
                Result :: binary().
 pbkdf2_hmac(Digest, Pass, Salt, Iter, KeyLen) ->
-  pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen).
+    ?nif_call(pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen)).
 
 pbkdf2_hmac_nif(_, _, _, _, _) -> ?nif_stub.
 
-- 
2.34.1

openSUSE Build Service is sponsored by