donau

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

commit 228099dc232fcf04652f2c3da726c27a17881572
parent b1f40d48e4c0f4f4fbfa875c291d3c57c9c4e04c
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun, 26 Oct 2025 13:17:57 +0100

fix leak (#10505)

Diffstat:
Msrc/donau/donau-httpd_batch-issue.c | 9+++++++--
Msrc/donaudb/pg_lookup_issued_receipts.c | 27++++++++++++++++++++-------
Msrc/include/donaudb_plugin.h | 60++++++++++++++++++++++++++++++------------------------------
Msrc/pq/pq_query_helper.c | 27+++++++++++++++++++--------
4 files changed, 76 insertions(+), 47 deletions(-)

diff --git a/src/donau/donau-httpd_batch-issue.c b/src/donau/donau-httpd_batch-issue.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2024 Taler Systems SA + Copyright (C) 2024, 2025 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -333,8 +333,13 @@ start: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "request has been made already!\n"); signatures_to_json (num_bkps, - check_receipts_meta.blinded_sig, + check_receipts_meta.blinded_sigs, blind_signatures); + for (size_t i = 0; i < check_receipts_meta.num_sig; i++) + { + GNUNET_CRYPTO_blinded_sig_decref ( + check_receipts_meta.blinded_sigs[i].blinded_sig); + } free_bkps (num_bkps, bkps); return TALER_MHD_REPLY_JSON_PACK ( diff --git a/src/donaudb/pg_lookup_issued_receipts.c b/src/donaudb/pg_lookup_issued_receipts.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2024 Taler Systems SA + Copyright (C) 2024, 2025 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -37,18 +37,21 @@ DH_PG_lookup_issued_receipts ( GNUNET_PQ_query_param_auto_from_type (h_receipts), GNUNET_PQ_query_param_end }; + struct DONAU_BlindedDonationUnitSignature *du_sigs; + size_t num_sigs; struct GNUNET_PQ_ResultSpec rs[] = { DONAU_PQ_result_spec_array_blinded_donation_unit_sig ( pg->conn, "blinded_sig", - &meta->num_sig, - &meta->blinded_sig), + &num_sigs, + &du_sigs), TALER_PQ_RESULT_SPEC_AMOUNT ("amount", &meta->amount), GNUNET_PQ_result_spec_uint64 ("charity_id", &meta->charity_id), GNUNET_PQ_result_spec_end }; + enum GNUNET_DB_QueryStatus qs; PREPARE (pg, "lookup_issued_receipts", @@ -58,8 +61,18 @@ DH_PG_lookup_issued_receipts ( " ,charity_id" " FROM receipts_issued" " WHERE receipt_hash=$1;"); - return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, - "lookup_issued_receipts", - params, - rs); + qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, + "lookup_issued_receipts", + params, + rs); + if (qs > 0) + { + /* prevent the result cleanup from freeing the signatures */ + meta->num_sig = num_sigs; + meta->blinded_sigs = du_sigs; + num_sigs = 0; + du_sigs = NULL; + } + GNUNET_PQ_cleanup_result (rs); + return qs; } diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h @@ -112,7 +112,7 @@ struct DONAUDB_IssuedReceiptsMetaData /** * Array of blinded signatures */ - struct DONAU_BlindedDonationUnitSignature *blinded_sig; + struct DONAU_BlindedDonationUnitSignature *blinded_sigs; }; @@ -216,7 +216,7 @@ struct DONAUDB_Plugin * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ enum GNUNET_GenericReturnValue - (*drop_tables)(void *cls); + (*drop_tables)(void *cls); /** * Create the necessary tables if they are not present @@ -229,7 +229,7 @@ struct DONAUDB_Plugin * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ enum GNUNET_GenericReturnValue - (*create_tables)(void *cls); + (*create_tables)(void *cls); /** @@ -241,8 +241,8 @@ struct DONAUDB_Plugin * @return #GNUNET_OK on success */ enum GNUNET_GenericReturnValue - (*start)(void *cls, - const char *name); + (*start)(void *cls, + const char *name); /** @@ -254,8 +254,8 @@ struct DONAUDB_Plugin * @return #GNUNET_OK on success */ enum GNUNET_GenericReturnValue - (*start_read_committed)(void *cls, - const char *name); + (*start_read_committed)(void *cls, + const char *name); /** * Start a READ ONLY serializable transaction. @@ -266,8 +266,8 @@ struct DONAUDB_Plugin * @return #GNUNET_OK on success */ enum GNUNET_GenericReturnValue - (*start_read_only)(void *cls, - const char *name); + (*start_read_only)(void *cls, + const char *name); /** @@ -277,7 +277,7 @@ struct DONAUDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*commit)(void *cls); + (*commit)(void *cls); /** @@ -291,7 +291,7 @@ struct DONAUDB_Plugin * #GNUNET_SYSERR on hard errors */ enum GNUNET_GenericReturnValue - (*preflight)(void *cls); + (*preflight)(void *cls); /** @@ -312,7 +312,7 @@ struct DONAUDB_Plugin * #GNUNET_SYSERR on DB errors */ enum GNUNET_GenericReturnValue - (*gc)(void *cls); + (*gc)(void *cls); /** @@ -367,7 +367,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_charity)( + (*lookup_charity)( void *cls, uint64_t charity_id, struct DONAUDB_CharityMetaData *meta); @@ -382,7 +382,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*do_charity_delete)( + (*do_charity_delete)( void *cls, uint64_t charity_id); @@ -395,7 +395,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*get_charities)( + (*get_charities)( void *cls, DONAUDB_GetCharitiesCallback cb, void *cb_cls); @@ -414,7 +414,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*insert_charity)( + (*insert_charity)( void *cls, const struct DONAU_CharityPublicKeyP *charity_pub, const char *charity_name, @@ -435,7 +435,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*update_charity)( + (*update_charity)( void *cls, uint64_t charity_id, const struct DONAU_CharityPublicKeyP *charity_pub, @@ -453,7 +453,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*iterate_donation_units)( + (*iterate_donation_units)( void *cls, DONAUDB_IterateDonationUnitsCallback cb, void *cb_cls); @@ -467,7 +467,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*get_history)( + (*get_history)( void *cls, DONAUDB_GetHistoryCallback cb, void *cb_cls); @@ -481,7 +481,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_history_entry)( + (*lookup_history_entry)( void *cls, const unsigned long long charity_id, const struct TALER_Amount *final_amount, @@ -495,7 +495,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*insert_donation_unit)( + (*insert_donation_unit)( void *cls, const struct DONAU_DonationUnitHashP *h_donation_unit_pub, const struct DONAU_DonationUnitPublicKey *donation_unit_pub, @@ -512,7 +512,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_history_entry)( + (*insert_history_entry)( void *cls, const uint64_t charity_id, const struct TALER_Amount *final_amount, @@ -531,7 +531,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_issued_receipt)( + (*insert_issued_receipt)( void *cls, const size_t num_blinded_sig, const struct DONAU_BlindedDonationUnitSignature signatures[num_blinded_sig], @@ -552,7 +552,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_submitted_receipts)( + (*insert_submitted_receipts)( void *cls, struct DONAU_HashDonorTaxId *h_donor_tax_id, size_t num_dr, @@ -567,7 +567,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*iterate_submitted_receipts)( + (*iterate_submitted_receipts)( void *cls, const uint64_t donation_year, const struct DONAU_HashDonorTaxId *h_donor_tax_id, @@ -581,7 +581,7 @@ struct DONAUDB_Plugin * @param value the amount of the donation unit */ enum GNUNET_DB_QueryStatus - (*lookup_donation_unit_amount)( + (*lookup_donation_unit_amount)( void *cls, const struct DONAU_DonationUnitHashP *h_donation_unit_pub, struct TALER_Amount *value); @@ -595,7 +595,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*lookup_issued_receipts)( + (*lookup_issued_receipts)( void *cls, struct DONAU_DonationReceiptHashP *h_receitps, struct DONAUDB_IssuedReceiptsMetaData *meta); @@ -609,7 +609,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_signing_key)( + (*insert_signing_key)( void *cls, const struct DONAU_DonauPublicKeyP *donau_pub, struct DONAUDB_SignkeyMetaData *meta); @@ -623,7 +623,7 @@ struct DONAUDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*lookup_signing_key)( + (*lookup_signing_key)( void *cls, const struct DONAU_DonauPublicKeyP *donau_pub, struct DONAUDB_SignkeyMetaData *meta); @@ -637,7 +637,7 @@ struct DONAUDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*iterate_active_signing_keys)( + (*iterate_active_signing_keys)( void *cls, DONAUDB_IterateActiveSigningKeysCallback cb, void *cb_cls); diff --git a/src/pq/pq_query_helper.c b/src/pq/pq_query_helper.c @@ -648,6 +648,7 @@ extract_array_generic ( int data_sz; char *data; // void *out = NULL; + struct DONAU_BlindedDonationUnitSignature *du_sigs = NULL; struct GNUNET_PQ_ArrayHeader_P header; int col_num; @@ -663,10 +664,12 @@ extract_array_generic ( } \ } while (0) - col_num = PQfnumber (result, fname); + col_num = PQfnumber (result, + fname); FAIL_IF (0 > col_num); - - data_sz = PQgetlength (result, row, col_num); + data_sz = PQgetlength (result, + row, + col_num); FAIL_IF (0 > data_sz); FAIL_IF (sizeof(header) > (size_t) data_sz); @@ -695,14 +698,13 @@ extract_array_generic ( { char *in = data + sizeof(header); - struct DONAU_BlindedDonationUnitSignature *du_sigs; + if (0 == header.dim) { if (NULL != dst_size) *dst_size = 0; goto FAIL; } - du_sigs = GNUNET_new_array (header.dim, struct DONAU_BlindedDonationUnitSignature); *((void **) dst) = du_sigs; @@ -721,7 +723,6 @@ extract_array_generic ( sizeof(val)); sz = ntohl (val); FAIL_IF (sizeof(be) > sz); - in += sizeof(val); GNUNET_memcpy (&be, in, @@ -765,7 +766,14 @@ extract_array_generic ( return GNUNET_OK; } FAIL: - GNUNET_free (*(void **) dst); + if (NULL != du_sigs) + { + for (size_t i = 0; i < *info->num; i++) + if (NULL != du_sigs[i].blinded_sig) + GNUNET_CRYPTO_blinded_sig_decref (du_sigs[i].blinded_sig); + GNUNET_free (du_sigs); + *((void **) dst) = NULL; + } return GNUNET_SYSERR; #undef FAIL_IF } @@ -791,7 +799,8 @@ array_cleanup (void *cls, if (NULL != du_sigs[i].blinded_sig) GNUNET_CRYPTO_blinded_sig_decref (du_sigs[i].blinded_sig); GNUNET_free (info); - GNUNET_free (*dst); + GNUNET_free (du_sigs); + *dst = NULL; } @@ -804,6 +813,8 @@ DONAU_PQ_result_spec_array_blinded_donation_unit_sig ( { struct ArrayResultCls *info = GNUNET_new (struct ArrayResultCls); + *num = 0; + *du_sigs = NULL; info->num = num; // info->typ = TALER_PQ_array_of_blinded_denom_sig; GNUNET_assert (GNUNET_OK ==