exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 1c3ce9f40c6c29252ffdd27d7295f1628d0a10be
parent 894aac44aa22cedcc3794369ac709c48d260a1d1
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat,  8 Aug 2026 22:18:55 +0200

handle INT_MIN negation properly for limit

Diffstat:
Msrc/auditordb/helper.c | 1-
Msrc/auditordb/iterate_amount_arithmetic_inconsistencies.c | 2+-
Msrc/auditordb/iterate_auditor_aml_holds.c | 2+-
Msrc/auditordb/iterate_auditor_closure_lags.c | 2+-
Msrc/auditordb/iterate_bad_sig_losses.c | 2+-
Msrc/auditordb/iterate_coin_inconsistencies.c | 2+-
Msrc/auditordb/iterate_denomination_key_validity_withdraw_inconsistencies.c | 2+-
Msrc/auditordb/iterate_denomination_pending.c | 2+-
Msrc/auditordb/iterate_denominations_without_sigs.c | 2+-
Msrc/auditordb/iterate_deposit_confirmations.c | 2+-
Msrc/auditordb/iterate_early_aggregations.c | 2+-
Msrc/auditordb/iterate_emergencies.c | 2+-
Msrc/auditordb/iterate_emergencies_by_count.c | 2+-
Msrc/auditordb/iterate_exchange_signkeys.c | 2+-
Msrc/auditordb/iterate_fee_time_inconsistencies.c | 2+-
Msrc/auditordb/iterate_historic_denom_revenue.c | 2+-
Msrc/auditordb/iterate_historic_reserve_revenue.c | 2+-
Msrc/auditordb/iterate_kycauth_in_inconsistencies.c | 2+-
Msrc/auditordb/iterate_misattribution_in_inconsistencies.c | 2+-
Msrc/auditordb/iterate_pending_deposits.c | 2+-
Msrc/auditordb/iterate_purse_not_closed_inconsistencies.c | 2+-
Msrc/auditordb/iterate_purses.c | 2+-
Msrc/auditordb/iterate_reserve_balance_insufficient_inconsistencies.c | 2+-
Msrc/auditordb/iterate_reserve_balance_summary_wrong_inconsistencies.c | 2+-
Msrc/auditordb/iterate_reserve_in_inconsistencies.c | 2+-
Msrc/auditordb/iterate_reserve_not_closed_inconsistencies.c | 2+-
Msrc/auditordb/iterate_reserves.c | 2+-
Msrc/auditordb/iterate_row_inconsistencies.c | 2+-
Msrc/auditordb/iterate_row_minor_inconsistencies.c | 2+-
Msrc/auditordb/iterate_wire_format_inconsistencies.c | 2+-
Msrc/auditordb/iterate_wire_out_inconsistencies.c | 2+-
Msrc/auditordb/pg_helper.h | 24++++++++++++++++++++++++
Msrc/include/auditordb_lib.h | 5-----
33 files changed, 54 insertions(+), 36 deletions(-)

diff --git a/src/auditordb/helper.c b/src/auditordb/helper.c @@ -30,7 +30,6 @@ TALER_AUDITORDB_get_deletable_suppressable_table_name ( const char *tables[] = { "auditor_amount_arithmetic_inconsistency", "auditor_closure_lags", - "auditor_progress", "auditor_bad_sig_losses", "auditor_coin_inconsistency", "auditor_denomination_key_validity_withdraw_inconsistency", diff --git a/src/auditordb/iterate_amount_arithmetic_inconsistencies.c b/src/auditordb/iterate_amount_arithmetic_inconsistencies.c @@ -113,7 +113,7 @@ TALER_AUDITORDB_iterate_amount_arithmetic_inconsistencies ( TALER_AUDITORDB_AmountArithmeticInconsistencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_auditor_aml_holds.c b/src/auditordb/iterate_auditor_aml_holds.c @@ -121,7 +121,7 @@ TALER_AUDITORDB_iterate_auditor_aml_holds ( TALER_AUDITORDB_AuditorAmlHoldCallback cb, TALER_AUDITORDB_AUDITOR_AML_HOLD_RESULT_CLOSURE *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_auditor_closure_lags.c b/src/auditordb/iterate_auditor_closure_lags.c @@ -112,7 +112,7 @@ TALER_AUDITORDB_iterate_auditor_closure_lags ( TALER_AUDITORDB_ClosureLagsCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_bad_sig_losses.c b/src/auditordb/iterate_bad_sig_losses.c @@ -111,7 +111,7 @@ TALER_AUDITORDB_iterate_bad_sig_losses ( TALER_AUDITORDB_BadSigLossesCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_coin_inconsistencies.c b/src/auditordb/iterate_coin_inconsistencies.c @@ -121,7 +121,7 @@ TALER_AUDITORDB_iterate_coin_inconsistencies ( void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_denomination_key_validity_withdraw_inconsistencies.c b/src/auditordb/iterate_denomination_key_validity_withdraw_inconsistencies.c @@ -112,7 +112,7 @@ TALER_AUDITORDB_iterate_denomination_key_validity_withdraw_inconsistencies ( TALER_AUDITORDB_DenominationKeyValidityWithdrawInconsistencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_denomination_pending.c b/src/auditordb/iterate_denomination_pending.c @@ -111,7 +111,7 @@ TALER_AUDITORDB_iterate_denomination_pending ( TALER_AUDITORDB_DenominationPendingCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&plimit), diff --git a/src/auditordb/iterate_denominations_without_sigs.c b/src/auditordb/iterate_denominations_without_sigs.c @@ -111,7 +111,7 @@ TALER_AUDITORDB_iterate_denominations_without_sigs ( TALER_AUDITORDB_DenominationsWithoutSigsCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_deposit_confirmations.c b/src/auditordb/iterate_deposit_confirmations.c @@ -153,7 +153,7 @@ TALER_AUDITORDB_iterate_deposit_confirmations ( TALER_AUDITORDB_DepositConfirmationCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_early_aggregations.c b/src/auditordb/iterate_early_aggregations.c @@ -116,7 +116,7 @@ TALER_AUDITORDB_iterate_early_aggregations (struct cb, void *cb_cls) { - uint64_t ulimit = (limit < 0) ? -limit : limit; + uint64_t ulimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&ulimit), diff --git a/src/auditordb/iterate_emergencies.c b/src/auditordb/iterate_emergencies.c @@ -114,7 +114,7 @@ TALER_AUDITORDB_iterate_emergencies (struct TALER_AUDITORDB_PostgresContext *pg, TALER_AUDITORDB_EmergencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_emergencies_by_count.c b/src/auditordb/iterate_emergencies_by_count.c @@ -120,7 +120,7 @@ TALER_AUDITORDB_iterate_emergencies_by_count (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_exchange_signkeys.c b/src/auditordb/iterate_exchange_signkeys.c @@ -114,7 +114,7 @@ TALER_AUDITORDB_iterate_exchange_signkeys ( TALER_AUDITORDB_ExchangeSignkeysCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&plimit), diff --git a/src/auditordb/iterate_fee_time_inconsistencies.c b/src/auditordb/iterate_fee_time_inconsistencies.c @@ -107,7 +107,7 @@ TALER_AUDITORDB_iterate_fee_time_inconsistencies ( TALER_AUDITORDB_FeeTimeInconsistencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_historic_denom_revenue.c b/src/auditordb/iterate_historic_denom_revenue.c @@ -119,7 +119,7 @@ TALER_AUDITORDB_iterate_historic_denom_revenue ( TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb, void *cb_cls) { - uint64_t ulimit = (limit > 0) ? limit : -limit; + uint64_t ulimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&ulimit), diff --git a/src/auditordb/iterate_historic_reserve_revenue.c b/src/auditordb/iterate_historic_reserve_revenue.c @@ -114,7 +114,7 @@ TALER_AUDITORDB_iterate_historic_reserve_revenue ( TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb, void *cb_cls) { - uint64_t ulimit = (limit > 0) ? limit : -limit; + uint64_t ulimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&ulimit), diff --git a/src/auditordb/iterate_kycauth_in_inconsistencies.c b/src/auditordb/iterate_kycauth_in_inconsistencies.c @@ -122,7 +122,7 @@ TALER_AUDITORDB_iterate_kycauth_in_inconsistencies ( TALER_AUDITORDB_KycauthInInconsistencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_misattribution_in_inconsistencies.c b/src/auditordb/iterate_misattribution_in_inconsistencies.c @@ -112,7 +112,7 @@ TALER_AUDITORDB_iterate_misattribution_in_inconsistencies (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_pending_deposits.c b/src/auditordb/iterate_pending_deposits.c @@ -124,7 +124,7 @@ TALER_AUDITORDB_iterate_pending_deposits (struct , void *cb_cls) { - uint64_t ulimit = (limit < 0) ? -limit : limit; + uint64_t ulimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_absolute_time (&deadline), GNUNET_PQ_query_param_uint64 (&offset), diff --git a/src/auditordb/iterate_purse_not_closed_inconsistencies.c b/src/auditordb/iterate_purse_not_closed_inconsistencies.c @@ -112,7 +112,7 @@ TALER_AUDITORDB_iterate_purse_not_closed_inconsistencies (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_purses.c b/src/auditordb/iterate_purses.c @@ -105,7 +105,7 @@ TALER_AUDITORDB_iterate_purses (struct TALER_AUDITORDB_PostgresContext *pg, TALER_AUDITORDB_PursesCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&plimit), diff --git a/src/auditordb/iterate_reserve_balance_insufficient_inconsistencies.c b/src/auditordb/iterate_reserve_balance_insufficient_inconsistencies.c @@ -117,7 +117,7 @@ TALER_AUDITORDB_iterate_reserve_balance_insufficient_inconsistencies (struct void * cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_reserve_balance_summary_wrong_inconsistencies.c b/src/auditordb/iterate_reserve_balance_summary_wrong_inconsistencies.c @@ -114,7 +114,7 @@ TALER_AUDITORDB_iterate_reserve_balance_summary_wrong_inconsistencies (struct void * cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_reserve_in_inconsistencies.c b/src/auditordb/iterate_reserve_in_inconsistencies.c @@ -120,7 +120,7 @@ TALER_AUDITORDB_iterate_reserve_in_inconsistencies (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_reserve_not_closed_inconsistencies.c b/src/auditordb/iterate_reserve_not_closed_inconsistencies.c @@ -111,7 +111,7 @@ TALER_AUDITORDB_iterate_reserve_not_closed_inconsistencies (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_reserves.c b/src/auditordb/iterate_reserves.c @@ -120,7 +120,7 @@ TALER_AUDITORDB_iterate_reserves (struct TALER_AUDITORDB_PostgresContext *pg, TALER_AUDITORDB_ReservesCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_uint64 (&plimit), diff --git a/src/auditordb/iterate_row_inconsistencies.c b/src/auditordb/iterate_row_inconsistencies.c @@ -113,7 +113,7 @@ TALER_AUDITORDB_iterate_row_inconsistencies ( void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_row_minor_inconsistencies.c b/src/auditordb/iterate_row_minor_inconsistencies.c @@ -105,7 +105,7 @@ TALER_AUDITORDB_iterate_row_minor_inconsistencies ( TALER_AUDITORDB_RowMinorInconsistenciesCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_wire_format_inconsistencies.c b/src/auditordb/iterate_wire_format_inconsistencies.c @@ -109,7 +109,7 @@ TALER_AUDITORDB_iterate_wire_format_inconsistencies (struct cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/iterate_wire_out_inconsistencies.c b/src/auditordb/iterate_wire_out_inconsistencies.c @@ -110,7 +110,7 @@ TALER_AUDITORDB_iterate_wire_out_inconsistencies ( TALER_AUDITORDB_WireOutInconsistencyCallback cb, void *cb_cls) { - uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); + uint64_t plimit = TALER_AUDITORDB_abs_limit (limit); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&offset), GNUNET_PQ_query_param_bool (return_suppressed), diff --git a/src/auditordb/pg_helper.h b/src/auditordb/pg_helper.h @@ -65,6 +65,30 @@ TALER_AUDITORDB_get_deletable_suppressable_table_name ( /** + * Convert the signed @a limit of a monitoring listing into the row + * limit to pass to SQL. The sign selects the iteration direction and + * the magnitude the number of rows, but computing `-limit` directly is + * undefined behaviour for `INT64_MIN`, and the resulting value would + * reach Postgres as `LIMIT -9223372036854775808`, which errors out. + * `INT64_MIN` is therefore saturated to `INT64_MAX`. + * + * @param limit signed limit as given by the caller + * @return absolute value of @a limit, without signed overflow + */ +static inline uint64_t +TALER_AUDITORDB_abs_limit (int64_t limit) +{ + /* Postgres binds INT8 as a *signed* 64-bit integer, so a magnitude + above INT64_MAX would reach LIMIT as a negative number. */ + if (INT64_MIN == limit) + return (uint64_t) INT64_MAX; + if (limit < 0) + return (uint64_t) -limit; + return (uint64_t) limit; +} + + +/** * Prepares SQL statement @a sql under @a name for * connection @a pg once. * Returns with #GNUNET_DB_STATUS_HARD_ERROR on failure. diff --git a/src/include/auditordb_lib.h b/src/include/auditordb_lib.h @@ -533,11 +533,6 @@ enum TALER_AUDITORDB_DeletableSuppressableTables TALER_AUDITORDB_CLOSURE_LAGS, /** - * For auditor_progress table. - */ - TALER_AUDITORDB_PROGRESS, - - /** * For auditor_bad_sig_losses table. */ TALER_AUDITORDB_BAD_SIG_LOSSES,