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:
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 */