From 3fd22f86df959ab248b66350bb7a9eaa1a2f7e27 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 16 Mar 2021 11:15:09 +1030 Subject: [PATCH] channeld: allow remote node to exceed their own HTLC count limits. We try not to exceed either side, but the spec still allows them to (we don't, but older nodes would have, as could other implementations). Fixes: #3953 Changelog-Fixed: protocol: overzealous close when peer sent more HTLCs than they'd told us we could send. Signed-off-by: Rusty Russell --- channeld/full_channel.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/channeld/full_channel.c b/channeld/full_channel.c index 4001a1faa..44ceb6119 100644 --- a/channeld/full_channel.c +++ b/channeld/full_channel.c @@ -489,7 +489,6 @@ static enum channel_add_err add_htlc(struct channel *channel, enum side sender = htlc_state_owner(state), recipient = !sender; const struct htlc **committed, **adding, **removing; const struct channel_view *view; - u32 min_concurrent_htlcs; htlc = tal(tmpctx, struct htlc); @@ -573,16 +572,19 @@ static enum channel_add_err add_htlc(struct channel *channel, * HTLCs to its local commitment transaction... * - SHOULD fail the channel. */ - /* Also we should not add more htlc's than sender or recipient - * configured. This mitigates attacks in which a peer can force the - * opener of the channel to pay unnecessary onchain fees during a fee + if (tal_count(committed) - tal_count(removing) + tal_count(adding) + > channel->config[recipient].max_accepted_htlcs) { + return CHANNEL_ERR_TOO_MANY_HTLCS; + } + + /* Also *we* should not add more htlc's we configured. This + * mitigates attacks in which a peer can force the opener of + * the channel to pay unnecessary onchain fees during a fee * spike with large commitment transactions. */ - min_concurrent_htlcs = channel->config[recipient].max_accepted_htlcs; - if (min_concurrent_htlcs > channel->config[sender].max_accepted_htlcs) - min_concurrent_htlcs = channel->config[sender].max_accepted_htlcs; - if (tal_count(committed) - tal_count(removing) + tal_count(adding) - > min_concurrent_htlcs) { + if (sender == LOCAL + && tal_count(committed) - tal_count(removing) + tal_count(adding) + > channel->config[LOCAL].max_accepted_htlcs) { return CHANNEL_ERR_TOO_MANY_HTLCS; }