Skip to content

Commit

Permalink
pay: ignore uncommited channels in listpeerchannels output
Browse files Browse the repository at this point in the history
Uncommited channels are missing several fields which would normally be
populated by an active channel.  This simply skips them for the purposes
of finding a route.  The particular culprit was:
{
  "peer_id": "038cd9f3679d5b39bb2105978467918d549572de472f07dd729e37c7a6377d41d5",
  "peer_connected": true,
  "state": "OPENINGD",
  "owner": "lightning_openingd",
  "opener": "local",
  "to_us_msat": 8317559000,
  "total_msat": 8317559000,
  "features": [
    "option_static_remotekey",
    "option_anchors_zero_fee_htlc_tx"
  ]
}

Fixes #7197 - SEGV in direct_pay_listpeerchannels when field private missing

Changelog-Fixed: Fixed crash in pay plugin caused by parsing uncommitted dual open channels
  • Loading branch information
endothermicdev committed Apr 18, 2024
1 parent d926154 commit efdf01d
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
8 changes: 7 additions & 1 deletion plugins/libplugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -2115,8 +2115,14 @@ static struct listpeers_channel *json_to_listpeers_channel(const tal_t *ctx,

json_to_node_id(buffer, idtok, &chan->id);
json_to_bool(buffer, conntok, &chan->connected);
json_to_bool(buffer, privtok, &chan->private);
if (privtok)
json_to_bool(buffer, privtok, &chan->private);
else
chan->private = true;
chan->state = json_strdup(chan, buffer, statetok);
if (streq(chan->state, "DUALOPEND_OPEN_INIT") ||
streq(chan->state, "OPENINGD"))
return tal_free(chan);
json_to_txid(buffer, ftxidtok, &chan->funding_txid);
if (scidtok != NULL) {
assert(dirtok != NULL);
Expand Down
1 change: 0 additions & 1 deletion tests/test_pay.py
Original file line number Diff line number Diff line change
Expand Up @@ -5590,7 +5590,6 @@ def test_pay_partial_msat(node_factory, executor):
l3pay.result(TIMEOUT)


@pytest.mark.xfail()
def test_pay_while_opening_channel(node_factory, bitcoind, executor):
delay_plugin = {'plugin': os.path.join(os.getcwd(),
'tests/plugins/openchannel_hook_delay.py'),
Expand Down

0 comments on commit efdf01d

Please sign in to comment.