diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-06-04 12:07:53 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-06-04 12:07:53 +0200 |
commit | 59fd83b73128d8393726caf58016b81b86cc3404 (patch) | |
tree | 23d7c6ccae9774ce5fbfb753b00849a4a84c8409 | |
parent | ad850ce0a9d0df1df6499cb9bb35671c460f61c1 (diff) |
fix memory leaks (#5050)
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | src/bank-lib/fakebank.c | 1 | ||||
-rw-r--r-- | src/exchange-lib/exchange_api_reserve.c | 68 |
4 files changed, 58 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore index 7f0c79eb7..4b4c4123a 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,4 @@ doc/manual/manual.toc doc/manual/manual.tp doc/manual/manual.vr contrib/taler-exchange.tag +doxygen-doc/ diff --git a/Makefile.am b/Makefile.am index a73d4d863..ab0f3acc4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,6 +13,8 @@ ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = \ AUTHORS \ contrib/coverage.sh \ + contrib/gnunet.tag \ + contrib/microhttpd.tag \ Doxyfile app: diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 924e0656a..ceda4d37b 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -361,6 +361,7 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h, (json_int_t) t->serial_id); json_str = json_dumps (json, JSON_INDENT(2)); + json_decref (json); if (NULL == json_str) { GNUNET_break (0); diff --git a/src/exchange-lib/exchange_api_reserve.c b/src/exchange-lib/exchange_api_reserve.c index 7649cccda..c7b486f0c 100644 --- a/src/exchange-lib/exchange_api_reserve.c +++ b/src/exchange-lib/exchange_api_reserve.c @@ -409,12 +409,43 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange, GNUNET_break_op (0); return GNUNET_SYSERR; } - return GNUNET_OK; } /** + * Free memory (potentially) allocated by #parse_reserve_history(). + * + * @param rhistory result to free + * @param len number of entries in @a rhistory + */ +static void +free_rhistory (struct TALER_EXCHANGE_ReserveHistory *rhistory, + unsigned int len) +{ + for (unsigned int i=0;i<len;i++) + { + switch (rhistory[i].type) + { + case TALER_EXCHANGE_RTT_DEPOSIT: + GNUNET_free_non_null (rhistory[i].details.in_details.wire_reference); + if (NULL != rhistory[i].details.in_details.sender_account_details) + json_decref (rhistory[i].details.in_details.sender_account_details); + break; + case TALER_EXCHANGE_RTT_WITHDRAWAL: + break; + case TALER_EXCHANGE_RTT_PAYBACK: + break; + case TALER_EXCHANGE_RTT_CLOSE: + if (NULL != rhistory[i].details.close_details.receiver_account_details) + json_decref (rhistory[i].details.close_details.receiver_account_details); + break; + } + } +} + + +/** * Function called when we're done processing the * HTTP /reserve/status request. * @@ -468,6 +499,7 @@ handle_reserve_status_finished (void *cls, { struct TALER_EXCHANGE_ReserveHistory rhistory[len]; + memset (rhistory, 0, sizeof (rhistory)); if (GNUNET_OK != parse_reserve_history (rsh->exchange, history, @@ -479,25 +511,29 @@ handle_reserve_status_finished (void *cls, { GNUNET_break_op (0); response_code = 0; - break; } - if (0 != - TALER_amount_cmp (&balance_from_history, - &balance)) + if ( (0 != response_code) && + (0 != + TALER_amount_cmp (&balance_from_history, + &balance)) ) { /* exchange cannot add up balances!? */ GNUNET_break_op (0); response_code = 0; - break; } - rsh->cb (rsh->cb_cls, - response_code, - TALER_EC_NONE, - json, - &balance, - len, - rhistory); - rsh->cb = NULL; + if (0 != response_code) + { + rsh->cb (rsh->cb_cls, + response_code, + TALER_EC_NONE, + json, + &balance, + len, + rhistory); + rsh->cb = NULL; + } + free_rhistory (rhistory, + len); } } break; @@ -796,8 +832,12 @@ reserve_withdraw_payment_required (struct TALER_EXCHANGE_ReserveWithdrawHandle * rhistory)) { GNUNET_break_op (0); + free_rhistory (rhistory, + len); return GNUNET_SYSERR; } + free_rhistory (rhistory, + len); } if (0 != |