commit 228099dc232fcf04652f2c3da726c27a17881572
parent b1f40d48e4c0f4f4fbfa875c291d3c57c9c4e04c
Author: Christian Grothoff <christian@grothoff.org>
Date: Sun, 26 Oct 2025 13:17:57 +0100
fix leak (#10505)
Diffstat:
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 ==