diff --git a/bitcoin/psbt.c b/bitcoin/psbt.c index bc49222cb..7a45dedf5 100644 --- a/bitcoin/psbt.c +++ b/bitcoin/psbt.c @@ -524,7 +524,8 @@ static void wally_tx_destroy(struct wally_tx *wtx) wally_tx_free(wtx); } -struct wally_tx *psbt_finalize(struct wally_psbt *psbt, bool finalize_in_place) +struct wally_tx *psbt_finalize(const tal_t *ctx, + struct wally_psbt *psbt, bool finalize_in_place) { struct wally_psbt *tmppsbt; struct wally_tx *wtx; @@ -585,6 +586,7 @@ struct wally_tx *psbt_finalize(struct wally_psbt *psbt, bool finalize_in_place) if (psbt_is_finalized(tmppsbt) && wally_psbt_extract(tmppsbt, &wtx) == WALLY_OK) { + tal_steal(ctx, wtx); tal_add_destructor(wtx, wally_tx_destroy); if (!finalize_in_place) wally_psbt_free(tmppsbt); diff --git a/bitcoin/psbt.h b/bitcoin/psbt.h index b74a18203..c0d605208 100644 --- a/bitcoin/psbt.h +++ b/bitcoin/psbt.h @@ -79,7 +79,8 @@ void psbt_txid(const tal_t *ctx, */ void psbt_elements_normalize_fees(struct wally_psbt *psbt); -struct wally_tx *psbt_finalize(struct wally_psbt *psbt, bool finalize_in_place); +struct wally_tx *psbt_finalize(const tal_t *ctx, + struct wally_psbt *psbt, bool finalize_in_place); /* psbt_make_key - Create a new, proprietary c-lightning key * diff --git a/bitcoin/tx.c b/bitcoin/tx.c index 9a8d09b99..e8b513def 100644 --- a/bitcoin/tx.c +++ b/bitcoin/tx.c @@ -502,7 +502,7 @@ struct bitcoin_tx *bitcoin_tx_with_psbt(const tal_t *ctx, struct wally_psbt *psb psbt->tx->num_outputs, psbt->tx->locktime); wally_tx_free(tx->wtx); - tx->wtx = psbt_finalize(psbt, false); + tx->wtx = psbt_finalize(tx, psbt, false); if (!tx->wtx && wally_tx_clone_alloc(psbt->tx, 0, &tx->wtx) != WALLY_OK) return NULL; diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 2cbfd38a3..b9e3690e4 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -590,7 +590,7 @@ openchannel2_sign_hook_cb(struct openchannel2_psbt_payload *payload STEALS) tal_steal(tmpctx, payload); /* Finalize it, if not already. It shouldn't work entirely */ - psbt_finalize(payload->psbt, true); + psbt_finalize(tmpctx, payload->psbt, true); if (!psbt_side_finalized(payload->ld->log, payload->psbt, REMOTE)) fatal("Plugin must return a 'psbt' with signatures for their inputs" diff --git a/wallet/walletrpc.c b/wallet/walletrpc.c index 26f8073d3..d2baa7fc6 100644 --- a/wallet/walletrpc.c +++ b/wallet/walletrpc.c @@ -812,7 +812,7 @@ static struct command_result *json_sendpsbt(struct command *cmd, sending = tal(cmd, struct sending_psbt); sending->cmd = cmd; - sending->wtx = tal_steal(sending, psbt_finalize(psbt, true)); + sending->wtx = psbt_finalize(sending, psbt, true); if (!sending->wtx) return command_fail(cmd, LIGHTNINGD, "PSBT not finalizeable %s",