mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 09:54:16 +01:00
channeld: handle more random pre-chatter from peers.
Fixes: #2559 Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
ba41238df9
commit
936678701b
@ -2114,6 +2114,24 @@ static void check_current_dataloss_fields(struct peer *peer,
|
||||
status_trace("option_data_loss_protect: fields are correct");
|
||||
}
|
||||
|
||||
/* Older LND sometimes sends funding_locked before reestablish! */
|
||||
/* ... or announcement_signatures. Sigh, let's handle whatever they send. */
|
||||
static bool capture_premature_msg(const u8 ***shit_lnd_says, const u8 *msg)
|
||||
{
|
||||
if (fromwire_peektype(msg) == WIRE_CHANNEL_REESTABLISH)
|
||||
return false;
|
||||
|
||||
/* Don't allow infinite memory consumption. */
|
||||
if (tal_count(*shit_lnd_says) > 10)
|
||||
return false;
|
||||
|
||||
status_trace("Stashing early %s msg!",
|
||||
wire_type_name(fromwire_peektype(msg)));
|
||||
|
||||
tal_arr_expand(shit_lnd_says, tal_steal(*shit_lnd_says, msg));
|
||||
return true;
|
||||
}
|
||||
|
||||
static void peer_reconnect(struct peer *peer,
|
||||
const struct secret *last_remote_per_commit_secret)
|
||||
{
|
||||
@ -2128,7 +2146,7 @@ static void peer_reconnect(struct peer *peer,
|
||||
remote_current_per_commitment_point;
|
||||
struct secret last_local_per_commitment_secret;
|
||||
bool dataloss_protect;
|
||||
const u8 *premature_funding_locked = NULL;
|
||||
const u8 **premature_msgs = tal_arr(peer, const u8 *, 0);
|
||||
|
||||
dataloss_protect = local_feature_negotiated(peer->localfeatures,
|
||||
LOCAL_DATA_LOSS_PROTECT);
|
||||
@ -2185,16 +2203,9 @@ static void peer_reconnect(struct peer *peer,
|
||||
do {
|
||||
clean_tmpctx();
|
||||
msg = sync_crypto_read(tmpctx, &peer->cs, PEER_FD);
|
||||
|
||||
/* Older LND sometimes sends funding_locked before reestablish! */
|
||||
if (fromwire_peektype(msg) == WIRE_FUNDING_LOCKED
|
||||
&& !premature_funding_locked) {
|
||||
status_trace("Stashing early funding_locked msg!");
|
||||
premature_funding_locked = tal_steal(peer, msg);
|
||||
msg = NULL;
|
||||
}
|
||||
} while (!msg || handle_peer_gossip_or_error(PEER_FD, GOSSIP_FD, &peer->cs,
|
||||
&peer->channel_id, msg));
|
||||
} while (handle_peer_gossip_or_error(PEER_FD, GOSSIP_FD, &peer->cs,
|
||||
&peer->channel_id, msg)
|
||||
|| capture_premature_msg(&premature_msgs, msg));
|
||||
|
||||
if (dataloss_protect) {
|
||||
if (!fromwire_channel_reestablish_option_data_loss_protect(msg,
|
||||
@ -2393,10 +2404,17 @@ static void peer_reconnect(struct peer *peer,
|
||||
|
||||
peer_billboard(true, "Reconnected, and reestablished.");
|
||||
|
||||
if (premature_funding_locked) {
|
||||
handle_peer_funding_locked(peer, premature_funding_locked);
|
||||
tal_free(premature_funding_locked);
|
||||
}
|
||||
/* BOLT #2:
|
||||
* - upon reconnection:
|
||||
*...
|
||||
* - MUST transmit `channel_reestablish` for each channel.
|
||||
* - MUST wait to receive the other node's `channel_reestablish`
|
||||
* message before sending any other messages for that channel.
|
||||
*/
|
||||
/* LND doesn't wait. */
|
||||
for (size_t i = 0; i < tal_count(premature_msgs); i++)
|
||||
peer_in(peer, premature_msgs[i]);
|
||||
tal_free(premature_msgs);
|
||||
}
|
||||
|
||||
/* ignores the funding_depth unless depth >= minimum_depth
|
||||
|
Loading…
Reference in New Issue
Block a user