mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-20 15:44:21 +01:00
json_getroute: don't leak.
Allocate the route off the current command, not dstate. And in the case where the route is somehow not via a peer, don't leak memory. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -241,7 +241,8 @@ static void json_getroute(struct command *cmd,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
peer = find_route(cmd->dstate, &id, msatoshi, riskfactor, &fee, &route);
|
peer = find_route(cmd, cmd->dstate, &id, msatoshi, riskfactor,
|
||||||
|
&fee, &route);
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
command_fail(cmd, "no route found");
|
command_fail(cmd, "no route found");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -273,7 +273,8 @@ static void bfg_one_edge(struct node *node, size_t edgenum, double riskfactor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct peer *find_route(struct lightningd_state *dstate,
|
struct peer *find_route(const tal_t *ctx,
|
||||||
|
struct lightningd_state *dstate,
|
||||||
const struct pubkey *to,
|
const struct pubkey *to,
|
||||||
u64 msatoshi,
|
u64 msatoshi,
|
||||||
double riskfactor,
|
double riskfactor,
|
||||||
@@ -350,15 +351,6 @@ struct peer *find_route(struct lightningd_state *dstate,
|
|||||||
dst = dst->bfg[best].prev->dst;
|
dst = dst->bfg[best].prev->dst;
|
||||||
best--;
|
best--;
|
||||||
|
|
||||||
*fee = dst->bfg[best].total - msatoshi;
|
|
||||||
*route = tal_arr(dstate, struct node_connection *, best);
|
|
||||||
for (i = 0, n = dst;
|
|
||||||
i < best;
|
|
||||||
n = n->bfg[best-i].prev->dst, i++) {
|
|
||||||
(*route)[i] = n->bfg[best-i].prev;
|
|
||||||
}
|
|
||||||
assert(n == src);
|
|
||||||
|
|
||||||
/* We should only add routes if we have a peer. */
|
/* We should only add routes if we have a peer. */
|
||||||
first = find_peer(dstate, &dst->id);
|
first = find_peer(dstate, &dst->id);
|
||||||
if (!first) {
|
if (!first) {
|
||||||
@@ -367,6 +359,15 @@ struct peer *find_route(struct lightningd_state *dstate,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*fee = dst->bfg[best].total - msatoshi;
|
||||||
|
*route = tal_arr(ctx, struct node_connection *, best);
|
||||||
|
for (i = 0, n = dst;
|
||||||
|
i < best;
|
||||||
|
n = n->bfg[best-i].prev->dst, i++) {
|
||||||
|
(*route)[i] = n->bfg[best-i].prev;
|
||||||
|
}
|
||||||
|
assert(n == src);
|
||||||
|
|
||||||
msatoshi += *fee;
|
msatoshi += *fee;
|
||||||
log_info(dstate->base_log, "find_route:");
|
log_info(dstate->base_log, "find_route:");
|
||||||
log_add_struct(dstate->base_log, "via %s", struct pubkey, first->id);
|
log_add_struct(dstate->base_log, "via %s", struct pubkey, first->id);
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ struct node_connection *add_connection(struct lightningd_state *dstate,
|
|||||||
void remove_connection(struct lightningd_state *dstate,
|
void remove_connection(struct lightningd_state *dstate,
|
||||||
const struct pubkey *src, const struct pubkey *dst);
|
const struct pubkey *src, const struct pubkey *dst);
|
||||||
|
|
||||||
struct peer *find_route(struct lightningd_state *dstate,
|
struct peer *find_route(const tal_t *ctx,
|
||||||
|
struct lightningd_state *dstate,
|
||||||
const struct pubkey *to,
|
const struct pubkey *to,
|
||||||
u64 msatoshi,
|
u64 msatoshi,
|
||||||
double riskfactor,
|
double riskfactor,
|
||||||
|
|||||||
Reference in New Issue
Block a user