-fix crash if there is a conflict on inserting into the purse_decision table

This commit is contained in:
Christian Grothoff 2022-12-05 11:15:59 +01:00
parent 07b4b1aa3f
commit 461dc8e36c
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 27 additions and 17 deletions

@ -1 +1 @@
Subproject commit a4a6b9ba4b2634c56194d53e36344686d7052cef
Subproject commit 212ee0a78adc43cb5c04d6ea96ccc2fe74fed62b

View File

@ -185,13 +185,14 @@ deposit_transaction (void *cls,
{
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
return qs;
GNUNET_break (0 != qs);
TALER_LOG_WARNING (
"Failed to store purse deposit information in database\n");
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_GENERIC_DB_STORE_FAILED,
"do purse deposit");
return qs;
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (! balance_ok)
{
@ -203,6 +204,9 @@ deposit_transaction (void *cls,
&coin->cpi.coin_pub);
return GNUNET_DB_STATUS_HARD_ERROR;
}
// FIXME: there is also a 'conflict' case where the purse was already
// decided (fully paid up OR expired), we should probably distinguish
// those better!
if (conflict)
{
struct TALER_Amount amount;

View File

@ -1557,7 +1557,14 @@ INSERT INTO purse_decision
VALUES
(in_purse_pub
,in_now
,FALSE);
,FALSE)
ON CONFLICT DO NOTHING;
IF NOT FOUND
THEN
out_conflict=TRUE;
RETURN;
END IF;
IF (my_in_reserve_quota)
THEN

View File

@ -1171,9 +1171,8 @@ TALER_EXCHANGE_batch_deposit (
* @param deposit the batch deposit permission request handle
*/
void
TALER_EXCHANGE_batch_deposit_force_dc (struct
TALER_EXCHANGE_BatchDepositHandle *
deposit);
TALER_EXCHANGE_batch_deposit_force_dc (
struct TALER_EXCHANGE_BatchDepositHandle *deposit);
/**
@ -1183,8 +1182,8 @@ TALER_EXCHANGE_batch_deposit_force_dc (struct
* @param deposit the deposit permission request handle
*/
void
TALER_EXCHANGE_batch_deposit_cancel (struct
TALER_EXCHANGE_BatchDepositHandle *deposit);
TALER_EXCHANGE_batch_deposit_cancel (
struct TALER_EXCHANGE_BatchDepositHandle *deposit);
/* ********************* /coins/$COIN_PUB/refund *********************** */
@ -1241,15 +1240,15 @@ typedef void
* signatures fail to verify). In this case, the callback is not called.
*/
struct TALER_EXCHANGE_RefundHandle *
TALER_EXCHANGE_refund (struct TALER_EXCHANGE_Handle *exchange,
const struct TALER_Amount *amount,
const struct
TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
uint64_t rtransaction_id,
const struct TALER_MerchantPrivateKeyP *merchant_priv,
TALER_EXCHANGE_RefundCallback cb,
void *cb_cls);
TALER_EXCHANGE_refund (
struct TALER_EXCHANGE_Handle *exchange,
const struct TALER_Amount *amount,
const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
uint64_t rtransaction_id,
const struct TALER_MerchantPrivateKeyP *merchant_priv,
TALER_EXCHANGE_RefundCallback cb,
void *cb_cls);
/**