summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVivien Kraus <vivien@planete-kraus.eu>2021-05-17 23:46:31 +0200
committerVivien Kraus <vivien@planete-kraus.eu>2021-05-18 00:49:21 +0200
commit1a52b8abb4ee98406d33c45eff5de9f6ca360bea (patch)
tree5d342a880b3e4da399dbd9b882176c350c770846 /src
parent70eb454bc21774b31bc0b17cb017bec831d5d695 (diff)
Prevent memory error bug
I discovered this with the recent guile update. If dynwind_mpz_t_clear is passed a copy of the mpz_t value, then the value living on the stack of dynwind_mpz_t_clear will be registered for garbage collection. However, that value becomes unreadable as soon as dynwind_mpz_t_clear returns, because its location on the stack is overriden.
Diffstat (limited to 'src')
-rw-r--r--src/jws/libwebidoidc-jws.c4
-rw-r--r--src/utilities.h18
2 files changed, 11 insertions, 11 deletions
diff --git a/src/jws/libwebidoidc-jws.c b/src/jws/libwebidoidc-jws.c
index 4de3cbc..17ae6b5 100644
--- a/src/jws/libwebidoidc-jws.c
+++ b/src/jws/libwebidoidc-jws.c
@@ -135,7 +135,7 @@ SCM_DEFINE (webidoidc_jws_sign_g, "sign", 3, 0, 0,
scm_throw (incompatible_alg, scm_list_2 (alg, key));
}
mpz_init (c_sig);
- dynwind_mpz_t_clear (c_sig);
+ dynwind_mpz_t_clear (&c_sig);
if (scm_is_eq (alg, rs256)
&& rsa_sha256_sign_digest_tr (&c_pub, &c_key, NULL,
&generate_random, c_digest, c_sig))
@@ -274,7 +274,7 @@ SCM_DEFINE (webidoidc_jws_verify_g, "verify", 4, 0, 0,
scm_throw (incompatible_alg, scm_list_2 (alg, key));
}
mpz_init (c_sig);
- dynwind_mpz_t_clear (c_sig);
+ dynwind_mpz_t_clear (&c_sig);
do_mpz_t_load (c_sig, signature, 1);
if (scm_is_eq (alg, rs256))
{
diff --git a/src/utilities.h b/src/utilities.h
index ae5d82c..c07265e 100644
--- a/src/utilities.h
+++ b/src/utilities.h
@@ -71,7 +71,7 @@ static int do_rsa_public_key_load (struct rsa_public_key *x, SCM data);
static int do_rsa_private_key_load (struct rsa_private_key *x, SCM data);
/* Register x to be destroyed at the end of the dynamic wind. */
-static void dynwind_mpz_t_clear (mpz_t x);
+static void dynwind_mpz_t_clear (mpz_t * x);
static void dynwind_ecc_point_clear (struct ecc_point *x);
static void dynwind_ecc_scalar_clear (struct ecc_scalar *x);
static void dynwind_rsa_public_key_clear (struct rsa_public_key *x);
@@ -167,9 +167,9 @@ wrap_ecc_point (const struct ecc_curve *crv, const struct ecc_point *point)
SCM ret;
scm_dynwind_begin (0);
mpz_init (x);
- dynwind_mpz_t_clear (x);
+ dynwind_mpz_t_clear (&x);
mpz_init (y);
- dynwind_mpz_t_clear (y);
+ dynwind_mpz_t_clear (&y);
ecc_point_get (point, x, y);
ret =
scm_list_3 (scm_cons (kcrv, wrap_ecc_curve (crv)),
@@ -185,7 +185,7 @@ wrap_ecc_scalar (const struct ecc_curve *crv, const struct ecc_scalar *scalar)
SCM ret;
scm_dynwind_begin (0);
mpz_init (z);
- dynwind_mpz_t_clear (z);
+ dynwind_mpz_t_clear (&z);
ecc_scalar_get (scalar, z);
ret =
scm_list_2 (scm_cons (kcrv, wrap_ecc_curve (crv)),
@@ -314,9 +314,9 @@ do_ecc_point_load (struct ecc_point *point, SCM data)
int ret = 1;
scm_dynwind_begin (0);
mpz_init (x);
- dynwind_mpz_t_clear (x);
+ dynwind_mpz_t_clear (&x);
mpz_init (y);
- dynwind_mpz_t_clear (y);
+ dynwind_mpz_t_clear (&y);
ret =
(do_mpz_t_load (x, scm_assq_ref (data, kx), 0)
&& do_mpz_t_load (y, scm_assq_ref (data, ky), 0)
@@ -332,7 +332,7 @@ do_ecc_scalar_load (struct ecc_scalar *scalar, SCM data)
int ret = 1;
scm_dynwind_begin (0);
mpz_init (z);
- dynwind_mpz_t_clear (z);
+ dynwind_mpz_t_clear (&z);
ret =
(do_mpz_t_load (z, scm_assq_ref (data, kd), 0)
&& ecc_scalar_set (scalar, z));
@@ -396,9 +396,9 @@ do_ecc_scalar_clear (void *ptr)
}
static inline void
-dynwind_mpz_t_clear (mpz_t z)
+dynwind_mpz_t_clear (mpz_t * z)
{
- scm_dynwind_unwind_handler (do_mpz_t_clear, &z, SCM_F_WIND_EXPLICITLY);
+ scm_dynwind_unwind_handler (do_mpz_t_clear, z, SCM_F_WIND_EXPLICITLY);
}
static inline void