From 7f90e9679b4b9bb214986f31e4d29ec16346feff Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Fri, 2 May 2025 13:36:52 -0400 Subject: [PATCH] gossip: Limit announcement sigs reply A splice where reestablish happens at the right moment causes an infinite loop of announcement signatures being sent back and forth. Limit the announcement sigs we send in response to announcement sigs to once per channel session. ChangelogNone --- lightningd/channel.c | 2 ++ lightningd/channel.h | 3 +++ lightningd/channel_gossip.c | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index 94ff06c7b..6d27be037 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -322,6 +322,7 @@ struct channel *new_unsaved_channel(struct peer *peer, /* Nothing happened yet */ memset(&channel->stats, 0, sizeof(channel->stats)); channel->state_changes = tal_arr(channel, struct channel_state_change *, 0); + channel->replied_to_announcement_sigs = false; /* No shachain yet */ channel->their_shachain.id = 0; @@ -632,6 +633,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid, channel->num_onchain_spent_calls = 0; channel->stats = *stats; channel->state_changes = tal_steal(channel, state_changes); + channel->replied_to_announcement_sigs = false; /* Populate channel->channel_gossip */ channel_gossip_init(channel, take(peer_update)); diff --git a/lightningd/channel.h b/lightningd/channel.h index 94de5c8b8..53c28be30 100644 --- a/lightningd/channel.h +++ b/lightningd/channel.h @@ -353,6 +353,9 @@ struct channel { /* Our change history. */ struct channel_state_change **state_changes; + + /* Have we replied to announcement_signatures once? */ + bool replied_to_announcement_sigs; }; /* Is channel owned (and should be talking to peer) */ diff --git a/lightningd/channel_gossip.c b/lightningd/channel_gossip.c index 76a503c98..0cfb8935c 100644 --- a/lightningd/channel_gossip.c +++ b/lightningd/channel_gossip.c @@ -688,7 +688,10 @@ void channel_gossip_got_announcement_sigs(struct channel *channel, * - MUST respond with its own `announcement_signatures` * message. */ - send_channel_announce_sigs(channel); + if(!channel->replied_to_announcement_sigs) { + send_channel_announce_sigs(channel); + channel->replied_to_announcement_sigs = true; + } check_channel_gossip(channel); return; }