mirror of
https://github.com/aljazceru/lightning.git
synced 2026-01-08 08:34:31 +01:00
df-spec: fail the open if they send us too many tx-collab msgs
This commit is contained in:
@@ -61,6 +61,21 @@
|
||||
#define REQ_FD STDIN_FILENO
|
||||
#define HSM_FD 6
|
||||
|
||||
/* tx_add_input, tx_add_output, tx_rm_input, tx_rm_output */
|
||||
#define NUM_TX_MSGS (TX_RM_OUTPUT + 1)
|
||||
enum tx_msgs {
|
||||
TX_ADD_INPUT,
|
||||
TX_ADD_OUTPUT,
|
||||
TX_RM_INPUT,
|
||||
TX_RM_OUTPUT,
|
||||
};
|
||||
|
||||
/*
|
||||
* BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
|
||||
- MUST NOT send more than 2^12 ... messages
|
||||
*/
|
||||
#define MAX_TX_MSG_RCVD (1 << 12)
|
||||
|
||||
/* Global state structure. This is only for the one specific peer and channel */
|
||||
struct state {
|
||||
struct per_peer_state *pps;
|
||||
@@ -124,6 +139,9 @@ struct state {
|
||||
|
||||
/* The serial_id of the funding output */
|
||||
u64 funding_serial;
|
||||
|
||||
/* Track how many of each tx collab msg we receive */
|
||||
u16 tx_msg_count[NUM_TX_MSGS];
|
||||
};
|
||||
|
||||
#if EXPERIMENTAL_FEATURES
|
||||
@@ -861,6 +879,17 @@ static bool run_tx_interactive(struct state *state,
|
||||
tal_hex(tmpctx, msg));
|
||||
|
||||
check_channel_id(state, &cid, &state->channel_id);
|
||||
|
||||
/*
|
||||
* BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
|
||||
* The receiving node:
|
||||
* - MUST fail the transaction collaboration if:
|
||||
* - it receives more than 2^12 `tx_add_input`
|
||||
* messages */
|
||||
if (++state->tx_msg_count[TX_ADD_INPUT] > MAX_TX_MSG_RCVD)
|
||||
peer_failed(state->pps, &state->channel_id,
|
||||
"Too many `tx_add_input`s"
|
||||
" received");
|
||||
/*
|
||||
* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
|
||||
* - if is the `initiator`:
|
||||
@@ -975,6 +1004,17 @@ static bool run_tx_interactive(struct state *state,
|
||||
|
||||
check_channel_id(state, &cid, &state->channel_id);
|
||||
|
||||
/*
|
||||
* BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
|
||||
* The receiving node:
|
||||
* - MUST fail the transaction collaboration if:
|
||||
* - it receives more than 2^12 `tx_rm_input`
|
||||
* messages */
|
||||
if (++state->tx_msg_count[TX_RM_INPUT] > MAX_TX_MSG_RCVD)
|
||||
peer_failed(state->pps, &state->channel_id,
|
||||
"Too many `tx_rm_input`s"
|
||||
" received");
|
||||
|
||||
/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
|
||||
* The sending node:
|
||||
* - MUST NOT send a `tx_remove_input` for an
|
||||
@@ -1006,6 +1046,17 @@ static bool run_tx_interactive(struct state *state,
|
||||
tal_hex(tmpctx, msg));
|
||||
check_channel_id(state, &cid, &state->channel_id);
|
||||
|
||||
/*
|
||||
* BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
|
||||
* The receiving node:
|
||||
* - MUST fail the transaction collaboration if:
|
||||
* - it receives more than 2^12 `tx_add_output`
|
||||
* messages */
|
||||
if (++state->tx_msg_count[TX_ADD_OUTPUT] > MAX_TX_MSG_RCVD)
|
||||
peer_failed(state->pps, &state->channel_id,
|
||||
"Too many `tx_add_output`s"
|
||||
" received");
|
||||
|
||||
/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
|
||||
* The receiving node:
|
||||
* ...
|
||||
@@ -1037,6 +1088,17 @@ static bool run_tx_interactive(struct state *state,
|
||||
|
||||
check_channel_id(state, &cid, &state->channel_id);
|
||||
|
||||
/*
|
||||
* BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
|
||||
* The receiving node:
|
||||
* - MUST fail the transaction collaboration if:
|
||||
* - it receives more than 2^12 `tx_rm_output`
|
||||
* messages */
|
||||
if (++state->tx_msg_count[TX_RM_OUTPUT] > MAX_TX_MSG_RCVD)
|
||||
peer_failed(state->pps, &state->channel_id,
|
||||
"Too many `tx_rm_output`s"
|
||||
" received");
|
||||
|
||||
/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
|
||||
* The sending node:
|
||||
* - MUST NOT send a `tx_remove_ouput` for an
|
||||
@@ -2116,6 +2178,8 @@ int main(int argc, char *argv[])
|
||||
* handle_peer_gossip_or_error compares this. */
|
||||
memset(&state->channel_id, 0, sizeof(state->channel_id));
|
||||
state->channel = NULL;
|
||||
for (size_t i = 0; i < NUM_TX_MSGS; i++)
|
||||
state->tx_msg_count[i] = 0;
|
||||
|
||||
/*~ We set these to NULL, meaning no requirements on shutdown */
|
||||
state->upfront_shutdown_script[LOCAL]
|
||||
|
||||
Reference in New Issue
Block a user