summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-08-29 12:39:47 +0200
committerChristian Grothoff <christian@grothoff.org>2020-08-29 12:39:47 +0200
commit2d0c9c8f0c730b3ee7e9f3551b628495aef1fd71 (patch)
tree213a6f81c061a2de9b23d964a1e193ec43d093ad /src
parente51c40338077a3bd93ca5b0be6d3ae15aec1af61 (diff)
downloadmerchant-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.c31
-rw-r--r--src/backenddb/test_merchantdb.c4
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 */