mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-20 07:34:24 +01:00
plugins/bcli: neaten to fix spurious leak report.
``` plugin-bcli: MEMLEAK: 0x1d2a118 plugin-bcli: label=plugins/bcli.c:636:const char *[] plugin-bcli: backtrace: plugin-bcli: ccan/ccan/tal/tal.c:442 (tal_alloc_) plugin-bcli: ccan/ccan/tal/tal.c:471 (tal_alloc_arr_) plugin-bcli: plugins/bcli.c:636 (estimatefees_next) plugin-bcli: plugins/bcli.c:684 (estimatefees) plugin-bcli: plugins/libplugin.c:1307 (ld_command_handle) plugin-bcli: plugins/libplugin.c:1348 (ld_read_json_one) plugin-bcli: plugins/libplugin.c:1368 (ld_read_json) plugin-bcli: ccan/ccan/io/io.c:59 (next_plan) plugin-bcli: ccan/ccan/io/io.c:407 (do_plan) plugin-bcli: ccan/ccan/io/io.c:417 (io_ready) plugin-bcli: ccan/ccan/io/poll.c:453 (io_loop) plugin-bcli: plugins/libplugin.c:1565 (plugin_main) plugin-bcli: plugins/bcli.c:965 (main) plugin-bcli: parents: plugin-bcli: plugins/libplugin.c:1235:struct command ``` It's neater to convert start_bitcoin_cli() to take varargs, and handle take: the above "leak" is because we don't keep a pointer to the params[] array which we use to pass to start_bitcoin_cli(). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Christian Decker
parent
4386ccd842
commit
cd37753849
124
plugins/bcli.c
124
plugins/bcli.c
@@ -94,14 +94,17 @@ struct bitcoin_cli {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Add the n'th arg to *args, incrementing n and keeping args of size n+1 */
|
/* Add the n'th arg to *args, incrementing n and keeping args of size n+1 */
|
||||||
static void add_arg(const char ***args, const char *arg)
|
static void add_arg(const char ***args, const char *arg TAKES)
|
||||||
{
|
{
|
||||||
|
if (taken(arg))
|
||||||
|
tal_steal(*args, arg);
|
||||||
tal_arr_expand(args, arg);
|
tal_arr_expand(args, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char **gather_args(const tal_t *ctx, const char *cmd, const char **cmd_args)
|
static const char **gather_argsv(const tal_t *ctx, const char *cmd, va_list ap)
|
||||||
{
|
{
|
||||||
const char **args = tal_arr(ctx, const char *, 1);
|
const char **args = tal_arr(ctx, const char *, 1);
|
||||||
|
const char *arg;
|
||||||
|
|
||||||
args[0] = bitcoind->cli ? bitcoind->cli : chainparams->cli;
|
args[0] = bitcoind->cli ? bitcoind->cli : chainparams->cli;
|
||||||
if (chainparams->cli_args)
|
if (chainparams->cli_args)
|
||||||
@@ -121,13 +124,26 @@ static const char **gather_args(const tal_t *ctx, const char *cmd, const char **
|
|||||||
tal_fmt(args, "-rpcpassword=%s", bitcoind->rpcpass));
|
tal_fmt(args, "-rpcpassword=%s", bitcoind->rpcpass));
|
||||||
|
|
||||||
add_arg(&args, cmd);
|
add_arg(&args, cmd);
|
||||||
for (size_t i = 0; i < tal_count(cmd_args); i++)
|
while ((arg = va_arg(ap, char *)) != NULL)
|
||||||
add_arg(&args, cmd_args[i]);
|
add_arg(&args, arg);
|
||||||
add_arg(&args, NULL);
|
add_arg(&args, NULL);
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LAST_ARG_NULL const char **
|
||||||
|
gather_args(const tal_t *ctx, const char *cmd, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
const char **ret;
|
||||||
|
|
||||||
|
va_start(ap, cmd);
|
||||||
|
ret = gather_argsv(ctx, cmd, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static struct io_plan *read_more(struct io_conn *conn, struct bitcoin_cli *bcli)
|
static struct io_plan *read_more(struct io_conn *conn, struct bitcoin_cli *bcli)
|
||||||
{
|
{
|
||||||
bcli->output_bytes += bcli->new_output;
|
bcli->output_bytes += bcli->new_output;
|
||||||
@@ -299,16 +315,15 @@ static void next_bcli(enum bitcoind_prio prio)
|
|||||||
tal_add_destructor(bcli, destroy_bcli);
|
tal_add_destructor(bcli, destroy_bcli);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If ctx is non-NULL, and is freed before we return, we don't call process().
|
|
||||||
* process returns false() if it's a spurious error, and we should retry. */
|
|
||||||
static void
|
static void
|
||||||
start_bitcoin_cli(const tal_t *ctx,
|
start_bitcoin_cliv(const tal_t *ctx,
|
||||||
struct command *cmd,
|
struct command *cmd,
|
||||||
struct command_result *(*process)(struct bitcoin_cli *),
|
struct command_result *(*process)(struct bitcoin_cli *),
|
||||||
bool nonzero_exit_ok,
|
bool nonzero_exit_ok,
|
||||||
enum bitcoind_prio prio,
|
enum bitcoind_prio prio,
|
||||||
char *method, const char **method_args,
|
void *stash,
|
||||||
void *stash)
|
const char *method,
|
||||||
|
va_list ap)
|
||||||
{
|
{
|
||||||
struct bitcoin_cli *bcli = tal(bitcoind, struct bitcoin_cli);
|
struct bitcoin_cli *bcli = tal(bitcoind, struct bitcoin_cli);
|
||||||
|
|
||||||
@@ -321,13 +336,33 @@ start_bitcoin_cli(const tal_t *ctx,
|
|||||||
else
|
else
|
||||||
bcli->exitstatus = NULL;
|
bcli->exitstatus = NULL;
|
||||||
|
|
||||||
bcli->args = gather_args(bcli, method, method_args);
|
bcli->args = gather_argsv(bcli, method, ap);
|
||||||
bcli->stash = stash;
|
bcli->stash = stash;
|
||||||
|
|
||||||
list_add_tail(&bitcoind->pending[bcli->prio], &bcli->list);
|
list_add_tail(&bitcoind->pending[bcli->prio], &bcli->list);
|
||||||
next_bcli(bcli->prio);
|
next_bcli(bcli->prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If ctx is non-NULL, and is freed before we return, we don't call process().
|
||||||
|
* process returns false() if it's a spurious error, and we should retry. */
|
||||||
|
static void LAST_ARG_NULL
|
||||||
|
start_bitcoin_cli(const tal_t *ctx,
|
||||||
|
struct command *cmd,
|
||||||
|
struct command_result *(*process)(struct bitcoin_cli *),
|
||||||
|
bool nonzero_exit_ok,
|
||||||
|
enum bitcoind_prio prio,
|
||||||
|
void *stash,
|
||||||
|
const char *method,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, method);
|
||||||
|
start_bitcoin_cliv(ctx, cmd, process, nonzero_exit_ok, prio, stash, method,
|
||||||
|
ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
static void strip_trailing_whitespace(char *str, size_t len)
|
static void strip_trailing_whitespace(char *str, size_t len)
|
||||||
{
|
{
|
||||||
size_t stripped_len = len;
|
size_t stripped_len = len;
|
||||||
@@ -539,7 +574,6 @@ getrawblockbyheight_notfound(struct bitcoin_cli *bcli)
|
|||||||
|
|
||||||
static struct command_result *process_getblockhash(struct bitcoin_cli *bcli)
|
static struct command_result *process_getblockhash(struct bitcoin_cli *bcli)
|
||||||
{
|
{
|
||||||
const char **params;
|
|
||||||
struct getrawblock_stash *stash = bcli->stash;
|
struct getrawblock_stash *stash = bcli->stash;
|
||||||
|
|
||||||
/* If it failed with error 8, give an empty response. */
|
/* If it failed with error 8, give an empty response. */
|
||||||
@@ -556,12 +590,13 @@ static struct command_result *process_getblockhash(struct bitcoin_cli *bcli)
|
|||||||
return command_err_bcli_badjson(bcli, "bad blockhash");
|
return command_err_bcli_badjson(bcli, "bad blockhash");
|
||||||
}
|
}
|
||||||
|
|
||||||
params = tal_arr(bcli->cmd, const char *, 2);
|
|
||||||
params[0] = stash->block_hash;
|
|
||||||
/* Non-verbose: raw block. */
|
|
||||||
params[1] = "0";
|
|
||||||
start_bitcoin_cli(NULL, bcli->cmd, process_getrawblock, false,
|
start_bitcoin_cli(NULL, bcli->cmd, process_getrawblock, false,
|
||||||
BITCOIND_HIGH_PRIO, "getblock", params, stash);
|
BITCOIND_HIGH_PRIO, stash,
|
||||||
|
"getblock",
|
||||||
|
stash->block_hash,
|
||||||
|
/* Non-verbose: raw block. */
|
||||||
|
"0",
|
||||||
|
NULL);
|
||||||
|
|
||||||
return command_still_pending(bcli->cmd);
|
return command_still_pending(bcli->cmd);
|
||||||
}
|
}
|
||||||
@@ -576,7 +611,6 @@ static struct command_result *getrawblockbyheight(struct command *cmd,
|
|||||||
{
|
{
|
||||||
struct getrawblock_stash *stash;
|
struct getrawblock_stash *stash;
|
||||||
u32 *height;
|
u32 *height;
|
||||||
const char **params;
|
|
||||||
|
|
||||||
/* bitcoin-cli wants a string. */
|
/* bitcoin-cli wants a string. */
|
||||||
if (!param(cmd, buf, toks,
|
if (!param(cmd, buf, toks,
|
||||||
@@ -586,11 +620,13 @@ static struct command_result *getrawblockbyheight(struct command *cmd,
|
|||||||
|
|
||||||
stash = tal(cmd, struct getrawblock_stash);
|
stash = tal(cmd, struct getrawblock_stash);
|
||||||
stash->block_height = *height;
|
stash->block_height = *height;
|
||||||
|
tal_free(height);
|
||||||
|
|
||||||
params = tal_arr(cmd, const char *, 1);
|
|
||||||
params[0] = tal_fmt(params, "%u", *height);
|
|
||||||
start_bitcoin_cli(NULL, cmd, process_getblockhash, true,
|
start_bitcoin_cli(NULL, cmd, process_getblockhash, true,
|
||||||
BITCOIND_LOW_PRIO, "getblockhash", params, stash);
|
BITCOIND_LOW_PRIO, stash,
|
||||||
|
"getblockhash",
|
||||||
|
take(tal_fmt(NULL, "%u", stash->block_height)),
|
||||||
|
NULL);
|
||||||
|
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
}
|
}
|
||||||
@@ -604,10 +640,11 @@ static struct command_result *getchaininfo(struct command *cmd,
|
|||||||
const jsmntok_t *toks UNUSED)
|
const jsmntok_t *toks UNUSED)
|
||||||
{
|
{
|
||||||
if (!param(cmd, buf, toks, NULL))
|
if (!param(cmd, buf, toks, NULL))
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
|
|
||||||
start_bitcoin_cli(NULL, cmd, process_getblockchaininfo, false,
|
start_bitcoin_cli(NULL, cmd, process_getblockchaininfo, false,
|
||||||
BITCOIND_HIGH_PRIO, "getblockchaininfo", NULL, NULL);
|
BITCOIND_HIGH_PRIO, NULL,
|
||||||
|
"getblockchaininfo", NULL);
|
||||||
|
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
}
|
}
|
||||||
@@ -633,12 +670,13 @@ static struct command_result *estimatefees_next(struct command *cmd,
|
|||||||
struct json_stream *response;
|
struct json_stream *response;
|
||||||
|
|
||||||
if (stash->cursor < ARRAY_SIZE(stash->perkb)) {
|
if (stash->cursor < ARRAY_SIZE(stash->perkb)) {
|
||||||
const char **params = tal_arr(cmd, const char *, 2);
|
|
||||||
|
|
||||||
params[0] = tal_fmt(params, "%u", estimatefee_params[stash->cursor].blocks);
|
|
||||||
params[1] = estimatefee_params[stash->cursor].style;
|
|
||||||
start_bitcoin_cli(NULL, cmd, estimatefees_done, true,
|
start_bitcoin_cli(NULL, cmd, estimatefees_done, true,
|
||||||
BITCOIND_LOW_PRIO, "estimatesmartfee", params, stash);
|
BITCOIND_LOW_PRIO, stash,
|
||||||
|
"estimatesmartfee",
|
||||||
|
take(tal_fmt(NULL, "%u",
|
||||||
|
estimatefee_params[stash->cursor].blocks)),
|
||||||
|
estimatefee_params[stash->cursor].style,
|
||||||
|
NULL);
|
||||||
|
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
}
|
}
|
||||||
@@ -708,12 +746,12 @@ static struct command_result *sendrawtransaction(struct command *cmd,
|
|||||||
const char *buf,
|
const char *buf,
|
||||||
const jsmntok_t *toks)
|
const jsmntok_t *toks)
|
||||||
{
|
{
|
||||||
const char **params = tal_arr(cmd, const char *, 1);
|
const char *tx, *highfeesarg;
|
||||||
bool *allowhighfees;
|
bool *allowhighfees;
|
||||||
|
|
||||||
/* bitcoin-cli wants strings. */
|
/* bitcoin-cli wants strings. */
|
||||||
if (!param(cmd, buf, toks,
|
if (!param(cmd, buf, toks,
|
||||||
p_req("tx", param_string, ¶ms[0]),
|
p_req("tx", param_string, &tx),
|
||||||
p_req("allowhighfees", param_bool, &allowhighfees),
|
p_req("allowhighfees", param_bool, &allowhighfees),
|
||||||
NULL))
|
NULL))
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
@@ -724,16 +762,19 @@ static struct command_result *sendrawtransaction(struct command *cmd,
|
|||||||
* maxfeerate, which when set to 0 means
|
* maxfeerate, which when set to 0 means
|
||||||
* no max feerate.
|
* no max feerate.
|
||||||
*/
|
*/
|
||||||
tal_arr_expand(¶ms, "0");
|
highfeesarg = "0";
|
||||||
else
|
else
|
||||||
/* in older versions, second arg is allowhighfees,
|
/* in older versions, second arg is allowhighfees,
|
||||||
* set to true to allow high fees.
|
* set to true to allow high fees.
|
||||||
*/
|
*/
|
||||||
tal_arr_expand(¶ms, "true");
|
highfeesarg = "true";
|
||||||
}
|
} else
|
||||||
|
highfeesarg = NULL;
|
||||||
|
|
||||||
start_bitcoin_cli(NULL, cmd, process_sendrawtransaction, true,
|
start_bitcoin_cli(NULL, cmd, process_sendrawtransaction, true,
|
||||||
BITCOIND_HIGH_PRIO, "sendrawtransaction", params, NULL);
|
BITCOIND_HIGH_PRIO, NULL,
|
||||||
|
"sendrawtransaction",
|
||||||
|
tx, highfeesarg, NULL);
|
||||||
|
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
}
|
}
|
||||||
@@ -742,17 +783,18 @@ static struct command_result *getutxout(struct command *cmd,
|
|||||||
const char *buf,
|
const char *buf,
|
||||||
const jsmntok_t *toks)
|
const jsmntok_t *toks)
|
||||||
{
|
{
|
||||||
const char **params = tal_arr(cmd, const char *, 2);
|
const char *txid, *vout;
|
||||||
|
|
||||||
/* bitcoin-cli wants strings. */
|
/* bitcoin-cli wants strings. */
|
||||||
if (!param(cmd, buf, toks,
|
if (!param(cmd, buf, toks,
|
||||||
p_req("txid", param_string, ¶ms[0]),
|
p_req("txid", param_string, &txid),
|
||||||
p_req("vout", param_string, ¶ms[1]),
|
p_req("vout", param_string, &vout),
|
||||||
NULL))
|
NULL))
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
|
|
||||||
start_bitcoin_cli(NULL, cmd, process_getutxout, true,
|
start_bitcoin_cli(NULL, cmd, process_getutxout, true,
|
||||||
BITCOIND_HIGH_PRIO, "gettxout", params, NULL);
|
BITCOIND_HIGH_PRIO, NULL,
|
||||||
|
"gettxout", txid, vout, NULL);
|
||||||
|
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user