donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 6f5f6d6a911ce99b8d533f5901af7dfdf1ce4119
parent 405c18675aec76a65854337ed9d075d469cf392a
Author: Christian Grothoff <grothoff@gnunet.org>
Date:   Mon, 20 Jul 2026 00:16:52 +0200

fix leaks

Diffstat:
Msrc/include/donau_crypto_lib.h | 2+-
Msrc/testing/testing_api_cmd_issue_receipts.c | 52++++++++++++++++++++++++++++++++++++++++++----------
Msrc/util/donau_crypto.c | 2+-
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 = {