commit 6f5f6d6a911ce99b8d533f5901af7dfdf1ce4119
parent 405c18675aec76a65854337ed9d075d469cf392a
Author: Christian Grothoff <grothoff@gnunet.org>
Date: Mon, 20 Jul 2026 00:16:52 +0200
fix leaks
Diffstat:
3 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/src/include/donau_crypto_lib.h b/src/include/donau_crypto_lib.h
@@ -593,7 +593,7 @@ DONAU_budi_secret_create (
*
* @return singleton to use for RSA blinding
*/
-const struct DONAU_BatchIssueValues *
+struct DONAU_BatchIssueValues *
DONAU_donation_unit_ewv_rsa_singleton (void);
diff --git a/src/testing/testing_api_cmd_issue_receipts.c b/src/testing/testing_api_cmd_issue_receipts.c
@@ -129,7 +129,7 @@ struct StatusState
/**
* Blinding values. Cs-nonces, cipher.
*/
- const struct DONAU_BatchIssueValues **alg_values;
+ struct DONAU_BatchIssueValues **alg_values;
/**
* Array of hashed udis.
@@ -292,12 +292,13 @@ cs_stage_two_callback (
stderr,
0);
TALER_TESTING_interpreter_fail (csr_data->ss->is);
+ GNUNET_free (csr_data);
return;
}
{
struct DONAU_DonationUnitPublicKey *cs_pk =
- &csr_data->ss->keys->donation_unit_keys[csr_data->position].key;
+ &csr_data->ss->selected_pks[csr_data->position];
struct DONAU_BatchIssueValues *alg_values
= GNUNET_new (struct DONAU_BatchIssueValues);
struct DONAU_BudiMasterSecretP ps;
@@ -311,9 +312,9 @@ cs_stage_two_callback (
GNUNET_assert (GNUNET_CRYPTO_BSA_CS ==
cs_pk->bsign_pub_key->cipher);
- DONAU_donation_unit_ewv_copy (alg_values,
- &csrresp->details.ok.
- alg_values);
+ DONAU_donation_unit_ewv_copy (
+ alg_values,
+ &csrresp->details.ok.alg_values);
GNUNET_CRYPTO_random_block (&ps,
sizeof (ps));
DONAU_budi_secret_create (&ps,
@@ -332,8 +333,13 @@ cs_stage_two_callback (
csr_data->ss->alg_values[csr_data->position] = alg_values;
csr_data->ss->cs_pending--;
}
- if (0 == csr_data->ss->cs_pending)
- phase_two (csr_data->ss);
+ {
+ struct StatusState *ss = csr_data->ss;
+
+ GNUNET_free (csr_data);
+ if (0 == ss->cs_pending)
+ phase_two (ss);
+ }
}
@@ -437,7 +443,7 @@ status_run (void *cls,
struct DONAU_DonationReceipt);
ss->alg_values =
GNUNET_new_array (ss->num_bkp,
- const struct DONAU_BatchIssueValues *);
+ struct DONAU_BatchIssueValues *);
ss->h_udis =
GNUNET_new_array (ss->num_bkp,
struct DONAU_UniqueDonorIdentifierHashP);
@@ -450,7 +456,7 @@ status_run (void *cls,
struct DONAU_UniqueDonorIdentifierHashP *udi_hash
= &ss->h_udis[cnt];
struct DONAU_BudiMasterSecretP ps;
- const struct DONAU_BatchIssueValues *alg_values;
+ struct DONAU_BatchIssueValues *alg_values;
DONAU_donation_unit_pub_hash (&ss->selected_pks[cnt],
&ss->bkps[cnt].h_donation_unit_pub);
@@ -534,6 +540,25 @@ cleanup (void *cls,
GNUNET_free (ss->selected_pks);
GNUNET_free (ss->h_udis);
+ if (NULL != ss->alg_values)
+ {
+ /* For CS units, cs_stage_two_callback allocated a per-unit
+ DONAU_BatchIssueValues with an incref'd blinding_inputs; for RSA
+ units the element is the shared static singleton (must not be
+ freed), and a still-pending CS unit leaves a NULL slot. */
+ for (unsigned int i = 0; i < ss->num_bkp; i++)
+ {
+ struct DONAU_BatchIssueValues *av = ss->alg_values[i];
+
+ if ( (NULL != av) &&
+ (av != DONAU_donation_unit_ewv_rsa_singleton ()) )
+ {
+ GNUNET_CRYPTO_blinding_input_values_decref (
+ av->blinding_inputs);
+ GNUNET_free (av);
+ }
+ }
+ }
GNUNET_free (ss->alg_values);
GNUNET_free (ss->blinding_secrets);
if (NULL != ss->receipts)
@@ -543,7 +568,14 @@ cleanup (void *cls,
ss->receipts[i].donation_unit_sig.unblinded_sig);
GNUNET_free (ss->receipts);
}
- GNUNET_free (ss->bkps);
+ if (NULL != ss->bkps)
+ {
+ for (unsigned int i = 0; i < ss->num_bkp; i++)
+ if (NULL != ss->bkps[i].blinded_udi.blinded_message)
+ GNUNET_CRYPTO_blinded_message_decref (
+ ss->bkps[i].blinded_udi.blinded_message);
+ GNUNET_free (ss->bkps);
+ }
GNUNET_free (ss);
}
diff --git a/src/util/donau_crypto.c b/src/util/donau_crypto.c
@@ -268,7 +268,7 @@ DONAU_budi_secret_create (
}
-const struct DONAU_BatchIssueValues *
+struct DONAU_BatchIssueValues *
DONAU_donation_unit_ewv_rsa_singleton ()
{
static struct GNUNET_CRYPTO_BlindingInputValues bi = {