merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit 2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71
parent e51c40338077a3bd93ca5b0be6d3ae15aec1af61
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 29 Aug 2020 12:39:47 +0200

fix memory leaks in orders/forget logic

Diffstat:
Msrc/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c | 31++++++++++++++++---------------
Msrc/backenddb/test_merchantdb.c | 4+++-
2 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c b/src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c @@ -68,12 +68,13 @@ TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh, { const char *order_id = hc->infix; enum GNUNET_DB_QueryStatus qs; - json_t *fields; - json_t *contract_terms; uint64_t order_serial; for (unsigned int i = 0; i<MAX_RETRIES; i++) { + json_t *fields; + json_t *contract_terms; + if (GNUNET_OK != TMH_db->start (TMH_db->cls, "forget order")) @@ -97,7 +98,8 @@ TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh, TALER_EC_ORDERS_CLAIM_HARD_DB_ERROR, NULL); case GNUNET_DB_STATUS_SOFT_ERROR: - goto retry; + TMH_db->rollback (TMH_db->cls); + continue; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: TMH_db->rollback (TMH_db->cls); return TALER_MHD_reply_with_error (connection, @@ -123,6 +125,7 @@ TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh, if (GNUNET_OK != res) { TMH_db->rollback (TMH_db->cls); + json_decref (contract_terms); return (GNUNET_NO == res) ? MHD_YES : MHD_NO; @@ -189,23 +192,21 @@ TMH_private_patch_orders_ID_forget (const struct TMH_RequestHandler *rh, hc->instance->settings.id, order_id, contract_terms); + json_decref (contract_terms); + json_decref (fields); if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs) { TMH_db->rollback (TMH_db->cls); - if (GNUNET_DB_STATUS_SOFT_ERROR == qs) - goto retry; - else - goto giveup; + if (GNUNET_DB_STATUS_SOFT_ERROR != qs) + break; + } + else + { + qs = TMH_db->commit (TMH_db->cls); + if (GNUNET_DB_STATUS_SOFT_ERROR != qs) + break; } - qs = TMH_db->commit (TMH_db->cls); -retry: - if (GNUNET_DB_STATUS_SOFT_ERROR == qs) - continue; - break; } -giveup: - json_decref (contract_terms); - json_decref (fields); if (0 > qs) { return TALER_MHD_reply_with_error (connection, diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c @@ -5352,8 +5352,10 @@ static int run_test_tips (struct TestTips_Closure *cls) { struct TALER_Amount zero; - TALER_amount_get_zero ("EUR", &zero); + GNUNET_assert (GNUNET_OK == + TALER_amount_get_zero ("EUR", + &zero)); TEST_RET_ON_FAIL (test_insert_instance (&cls->instance, GNUNET_DB_STATUS_SUCCESS_ONE_RESULT)); /* Test insert reserve */