diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-08-29 12:39:47 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-08-29 12:39:47 +0200 |
commit | 2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71 (patch) | |
tree | 213a6f81c061a2de9b23d964a1e193ec43d093ad /src | |
parent | e51c40338077a3bd93ca5b0be6d3ae15aec1af61 (diff) | |
download | merchant-2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71.tar.gz merchant-2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71.tar.bz2 merchant-2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71.zip |
fix memory leaks in orders/forget logic
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/taler-merchant-httpd_private-patch-orders-ID-forget.c | 31 | ||||
-rw-r--r-- | src/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 index d2d7d65f..86e7d036 100644 --- 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 index 4d33dfb1..f91d495c 100644 --- 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 */ |