summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-09-15 10:54:10 +0200
committerChristian Grothoff <christian@grothoff.org>2019-09-15 10:54:10 +0200
commit8843d60e683157f40e1908a4dc57b82f6f6bb6ee (patch)
tree177c6bea47fb7580251aa9d3242f971d26970efe
parentfc19601efc46cf31bf81c0d5980d6802148f5964 (diff)
downloadexchange-8843d60e683157f40e1908a4dc57b82f6f6bb6ee.tar.gz
exchange-8843d60e683157f40e1908a4dc57b82f6f6bb6ee.tar.bz2
exchange-8843d60e683157f40e1908a4dc57b82f6f6bb6ee.zip
fix memory leak and style issues
-rw-r--r--src/exchange-tools/taler-wire.c70
-rw-r--r--src/include/taler_wire_plugin.h50
-rw-r--r--src/wire-plugins/plugin_wire_taler-bank.c22
-rw-r--r--src/wire-plugins/test_wire_plugin_transactions_taler-bank.c7
4 files changed, 63 insertions, 86 deletions
diff --git a/src/exchange-tools/taler-wire.c b/src/exchange-tools/taler-wire.c
index 213c1eff3..f9c4a3579 100644
--- a/src/exchange-tools/taler-wire.c
+++ b/src/exchange-tools/taler-wire.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2014-2018 Taler Systems SA
+ Copyright (C) 2014--2019 Taler Systems SA
TALER is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as
@@ -29,62 +29,67 @@
#include "taler_wire_lib.h"
/**
- * If set to GNUNET_YES, then we'll ask the bank for a list
+ * If set to #GNUNET_YES, then we'll ask the bank for a list
* of transactions from the account mentioned in the config
* section.
*/
-int history;
+static int history;
/**
* If set to GNUNET_YES, then we'll ask the bank to execute a
* wire transfer.
*/
-int transfer;
+static int transfer;
/**
* Name of the wire plugin to use with the bank.
*/
-char *plugin_name;
+static char *plugin_name;
/**
* Global return code.
*/
-unsigned int global_ret = 1;
+static unsigned int global_ret = 1;
/**
* When a wire transfer is being performed, this value
* specifies the amount to wire-transfer. It's given in
* the usual CURRENCY:X[.Y] format.
*/
-char *amount;
+static char *amount;
/**
* Base32 encoding of a transaction ID. When asking the
* bank for a transaction history, all the results will
* have a transaction ID settled *after* this one.
*/
-char *since_when;
+static char *since_when;
/**
* Which config section has the credentials to access the bank.
*/
-char *account_section;
+static char *account_section;
/**
* URL identifying the account that is going to receive the
* wire transfer.
*/
-char *destination_account_url;
+static char *destination_account_url;
/**
* Handle for the wire transfer preparation task.
*/
-struct TALER_WIRE_PrepareHandle *ph;
+static struct TALER_WIRE_PrepareHandle *ph;
/**
* Wire plugin handle.
*/
-struct TALER_WIRE_Plugin *plugin_handle;
+static struct TALER_WIRE_Plugin *plugin_handle;
+
+/**
+ * Handle to ongoing history operation.
+ */
+static struct TALER_WIRE_HistoryHandle *hh;
/**
@@ -274,15 +279,14 @@ execute_history ()
bin_len));
}
- if (NULL == plugin_handle->get_history
- (plugin_handle->cls,
- account_section,
- TALER_BANK_DIRECTION_BOTH,
- since_when_bin,
- bin_len,
- -10,
- history_cb,
- NULL))
+ if (NULL == (hh = plugin_handle->get_history (plugin_handle->cls,
+ account_section,
+ TALER_BANK_DIRECTION_BOTH,
+ since_when_bin,
+ bin_len,
+ -10,
+ &history_cb,
+ NULL)))
{
fprintf (stderr,
"Could not request the transaction history.\n");
@@ -297,9 +301,21 @@ execute_history ()
*
* @param cls closure.
*/
-void
+static void
do_shutdown (void *cls)
{
+ if (NULL != hh)
+ {
+ plugin_handle->get_history_cancel (plugin_handle->cls,
+ hh);
+ hh = NULL;
+ }
+ if (NULL != ph)
+ {
+ plugin_handle->prepare_wire_transfer_cancel (plugin_handle->cls,
+ ph);
+ ph = NULL;
+ }
TALER_WIRE_plugin_unload (plugin_handle);
}
@@ -377,8 +393,7 @@ main (int argc,
struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_flag ('H',
"history",
- "Ask to get a list of 10"
- " transactions.",
+ "Ask to get a list of 10 transactions.",
&history),
GNUNET_GETOPT_option_flag ('t',
"transfer",
@@ -398,9 +413,7 @@ main (int argc,
GNUNET_GETOPT_option_string ('s',
"section",
"ACCOUNT-SECTION",
- "Which config section has the"
- " credentials to access the"
- " bank. Mandatory.\n",
+ "Which config section has the credentials to access the bank. Mandatory.\n",
&account_section),
GNUNET_GETOPT_option_string ('a',
"amount",
@@ -410,8 +423,7 @@ main (int argc,
GNUNET_GETOPT_option_string ('d',
"destination",
"PAYTO-URL",
- "Destination account for the"
- " wire transfer.",
+ "Destination account for the wire transfer.",
&destination_account_url),
GNUNET_GETOPT_OPTION_END
};
diff --git a/src/include/taler_wire_plugin.h b/src/include/taler_wire_plugin.h
index eb43f2277..ffc7adf59 100644
--- a/src/include/taler_wire_plugin.h
+++ b/src/include/taler_wire_plugin.h
@@ -96,7 +96,8 @@ struct TALER_WIRE_TransferDetails
*
* @param cls closure
* @param ec taler error code
- * @param dir direction of the transfer
+ * @param dir direction of the transfer, #TALER_BANK_DIRECTION_NONE when
+ * the iteration is complete
* @param row_off identification of the position at which we are querying
* @param row_off_size number of bytes in @a row_off
* @param details details about the wire transfer
@@ -368,53 +369,6 @@ struct TALER_WIRE_Plugin
(*reject_transfer_cancel)(void *cls,
struct TALER_WIRE_RejectHandle *rh);
-
- /**
- * Ask the plugin which data is needed to register the merchant
- * into the banking institution.
- *
- * @param enc[out] where to store the JSON formatted list of
- * needed values. The merchant will use this list to
- * show a HTML form to the business in order to collect that data.
- * This value will have to be freed by the caller.
- * @param private_person GNUNET_OK if the merchant to be registered
- * has a legal status of "person", for example they are freelance
- * journalists.
- * @param business GNUNET_OK if the merchant has the legal status
- * of "business", so to say a "ordinary" shop. Cannot be
- * both private and business though.
- * @return GNUNET_OK upon successful `enc' allocation and definition,
- * GNUNET_NO if _no_ data is needed at all, GNUNET_SYSERR
- * for all the other cases.
- */
- int
- (*merchant_data)(char **out,
- unsigned int private_person,
- unsigned int business);
-
- /**
- * Send data to the banking institution in order to get the
- * merchant registered.
- *
- * @param cls closure
- * @param body subset of information to be sent to the bank.
- * The plugin implementation is free to modify this value.
- * @param mrcb Callback to process the outcome.
- */
- struct TALER_WIRE_MerchantRegisterHandle *
- (*merchant_register)(void *cls,
- const char *body,
- TALER_WIRE_MerchantRegisterCallback mrcb);
-
- /**
- * Cancel pending operation of merchant registering.
- *
- * @param cls closure
- * @param mrh handle to the pending operation to be cancelled.
- */
- void
- (*merchant_register_cancel)(void *cls,
- struct TALER_WIRE_MerchantRegisterHandle *mrh);
};
diff --git a/src/wire-plugins/plugin_wire_taler-bank.c b/src/wire-plugins/plugin_wire_taler-bank.c
index 97b1e6c84..e1db643d3 100644
--- a/src/wire-plugins/plugin_wire_taler-bank.c
+++ b/src/wire-plugins/plugin_wire_taler-bank.c
@@ -765,7 +765,8 @@ struct TALER_WIRE_HistoryHandle
{
/**
- * Function to call with results.
+ * Function to call with results, can become NULL if the
+ * application cancels the iteration.
*/
TALER_WIRE_HistoryResultCallback hres_cb;
@@ -797,6 +798,7 @@ static void
taler_bank_get_history_cancel (void *cls,
struct TALER_WIRE_HistoryHandle *whh)
{
+ (void) cls;
if (NULL != whh->hh)
{
TALER_BANK_history_cancel (whh->hh);
@@ -893,7 +895,11 @@ bhist_cb (void *cls,
GNUNET_break (NULL != whh->hh);
/* Once we get the sentinel element, the handle becomes invalid. */
if (TALER_BANK_DIRECTION_NONE == dir)
+ {
whh->hh = NULL;
+ taler_bank_get_history_cancel (NULL,
+ whh);
+ }
return;
}
case MHD_HTTP_NO_CONTENT:
@@ -904,6 +910,9 @@ bhist_cb (void *cls,
NULL,
0,
NULL);
+ whh->hh = NULL;
+ taler_bank_get_history_cancel (NULL,
+ whh);
break;
default:
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -917,6 +926,9 @@ bhist_cb (void *cls,
NULL,
0,
NULL);
+ whh->hh = NULL;
+ taler_bank_get_history_cancel (NULL,
+ whh);
break;
}
whh->hh = NULL;
@@ -962,6 +974,7 @@ taler_bank_get_history (void *cls,
uint64_t start_row;
struct TALER_Account account;
+ GNUNET_assert (NULL != hres_cb);
if (0 == num_results)
{
GNUNET_break (0);
@@ -1019,13 +1032,12 @@ taler_bank_get_history (void *cls,
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Could not parse the auth values from '%s'\n",
account_section);
+ TALER_WIRE_account_free (&account);
GNUNET_free (whh);
return NULL;
}
-
whh->hres_cb = hres_cb;
whh->hres_cb_cls = hres_cb_cls;
-
whh->hh = TALER_BANK_history (tc->ctx,
account.details.x_taler_bank.bank_base_url,
&whh->auth,
@@ -1040,16 +1052,16 @@ taler_bank_get_history (void *cls,
if (NULL == whh->hh)
{
GNUNET_break (0);
- taler_bank_get_history_cancel (NULL,
+ taler_bank_get_history_cancel (tc,
whh);
TALER_WIRE_account_free (&account);
return NULL;
}
TALER_WIRE_account_free (&account);
- GNUNET_assert (NULL != whh);
return whh;
}
+
/**
* Context for a rejection operation.
*/
diff --git a/src/wire-plugins/test_wire_plugin_transactions_taler-bank.c b/src/wire-plugins/test_wire_plugin_transactions_taler-bank.c
index 2cda49a05..fa0db5b41 100644
--- a/src/wire-plugins/test_wire_plugin_transactions_taler-bank.c
+++ b/src/wire-plugins/test_wire_plugin_transactions_taler-bank.c
@@ -107,6 +107,7 @@ static struct TALER_WireTransferIdentifierRawP wtid;
static void
do_shutdown (void *cls)
{
+ (void) cls;
TALER_FAKEBANK_stop (fb);
fb = NULL;
if (NULL != eh)
@@ -186,11 +187,11 @@ history_result_cb
uint64_t serialh;
struct TALER_Amount amount;
- hh = NULL;
if ( (TALER_BANK_DIRECTION_NONE == dir) &&
(GNUNET_OK == global_ret) )
{
GNUNET_SCHEDULER_shutdown ();
+ hh = NULL;
return GNUNET_OK;
}
if (sizeof (uint64_t) != row_off_size)
@@ -251,6 +252,7 @@ confirmation_cb (void *cls,
const char *emsg)
{
uint64_t tmp;
+
eh = NULL;
if (GNUNET_OK != success)
{
@@ -259,13 +261,10 @@ confirmation_cb (void *cls,
GNUNET_SCHEDULER_shutdown ();
return;
}
-
memcpy (&tmp,
row_id,
row_id_size);
-
serial_target = GNUNET_ntohll (tmp);
-
hh = plugin->get_history (plugin->cls,
my_account,
TALER_BANK_DIRECTION_BOTH,