-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) if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
return qs; return qs;
GNUNET_break (0 != qs);
TALER_LOG_WARNING ( TALER_LOG_WARNING (
"Failed to store purse deposit information in database\n"); "Failed to store purse deposit information in database\n");
*mhd_ret = TALER_MHD_reply_with_error (connection, *mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_GENERIC_DB_STORE_FAILED, TALER_EC_GENERIC_DB_STORE_FAILED,
"do purse deposit"); "do purse deposit");
return qs; return GNUNET_DB_STATUS_HARD_ERROR;
} }
if (! balance_ok) if (! balance_ok)
{ {
@ -203,6 +204,9 @@ deposit_transaction (void *cls,
&coin->cpi.coin_pub); &coin->cpi.coin_pub);
return GNUNET_DB_STATUS_HARD_ERROR; 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) if (conflict)
{ {
struct TALER_Amount amount; struct TALER_Amount amount;

View File

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

View File

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