diff --git a/src/exchange/taler-exchange-httpd_db.c b/src/exchange/taler-exchange-httpd_db.c index 0634e34f6..f53600cc1 100644 --- a/src/exchange/taler-exchange-httpd_db.c +++ b/src/exchange/taler-exchange-httpd_db.c @@ -2402,9 +2402,19 @@ TEH_DB_execute_payback (struct MHD_Connection *connection, return TEH_RESPONSE_reply_internal_db_error (connection, TALER_EC_PAYBACK_HISTORY_DB_ERROR); } - TALER_amount_subtract (&amount, - value, - &spent); + if (GNUNET_SYSERR == + TALER_amount_subtract (&amount, + value, + &spent)) + { + GNUNET_break (0); + TEH_plugin->rollback (TEH_plugin->cls, + session); + TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, + tl); + return TEH_RESPONSE_reply_internal_db_error (connection, + TALER_EC_PAYBACK_COIN_BALANCE_NEGATIVE); + } if ( (0 == amount.fraction) && (0 == amount.value) ) { diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index 84240c295..bfca715a2 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -896,6 +896,13 @@ enum TALER_ErrorCode */ TALER_EC_PAYBACK_BLINDING_FAILED = 1858, + /** + * The coin's remaining balance is zero. The request is denied. + * This response is provided with an HTTP status code of + * MHD_HTTP_INTERNAL_SERVER_ERROR + */ + TALER_EC_PAYBACK_COIN_BALANCE_NEGATIVE = 1857, + /* *********** Merchant backend error codes ********* */