libplugin-pay: fix spurious leak reports.

1. The dijkstra can be temporary, doesn't need to last as long as pay cmd.
2. We fail multiple times in several places, so don't leak old failreason.
3. Make payments findable by our memleak detector.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2022-02-26 11:20:33 +10:30
parent 4b7d2dc5b8
commit 246b724dbe
2 changed files with 7 additions and 2 deletions

View File

@@ -766,7 +766,7 @@ static struct route_hop *route(const tal_t *ctx,
/* Try using disabled channels too */
/* FIXME: is there somewhere we can annotate this for paystatus? */
can_carry = payment_route_can_carry_even_disabled;
dij = dijkstra(ctx, gossmap, dst, amount, riskfactor,
dij = dijkstra(tmpctx, gossmap, dst, amount, riskfactor,
can_carry, route_score, p);
r = route_from_dijkstra(ctx, gossmap, dij, src,
amount, final_delay);
@@ -2122,6 +2122,8 @@ void payment_abort(struct payment *p, const char *fmt, ...) {
payment_set_step(p, PAYMENT_STEP_FAILED);
p->end_time = time_now();
/* We can fail twice, it seems. */
tal_free(p->failreason);
va_start(ap, fmt);
p->failreason = tal_vfmt(p, fmt, ap);
va_end(ap);
@@ -2147,6 +2149,8 @@ void payment_fail(struct payment *p, const char *fmt, ...)
va_list ap;
p->end_time = time_now();
payment_set_step(p, PAYMENT_STEP_FAILED);
/* We can fail twice, it seems. */
tal_free(p->failreason);
va_start(ap, fmt);
p->failreason = tal_vfmt(p, fmt, ap);
va_end(ap);

View File

@@ -160,11 +160,12 @@ struct payment_constraints {
};
struct payment {
/* Usually in global payments list */
struct list_node list;
/* The command that triggered this payment. Only set for the root
* payment. */
struct command *cmd;
struct plugin *plugin;
struct list_node list;
struct node_id *local_id;
const char *json_buffer;