Skip to content

Commit c2f72b9

Browse files
committed
Drop msgs bound for a disconnecting peer at disconnect time
This simplifies chanmon_fail_consistency greatly and makes it a tiny bit more realistic. It also sets us up for more disconnect-relatex events without the complexity blowing up.
1 parent 2ca697a commit c2f72b9

File tree

1 file changed

+72
-23
lines changed

1 file changed

+72
-23
lines changed

fuzz/fuzz_targets/chanmon_fail_consistency.rs

Lines changed: 72 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use utils::test_logger;
4949
use secp256k1::key::{PublicKey,SecretKey};
5050
use secp256k1::Secp256k1;
5151

52+
use std::mem;
5253
use std::cmp::Ordering;
5354
use std::collections::HashSet;
5455
use std::sync::{Arc,Mutex};
@@ -286,8 +287,8 @@ pub fn do_test(data: &[u8]) {
286287

287288
let mut chan_a_disconnected = false;
288289
let mut chan_b_disconnected = false;
289-
let mut chan_a_reconnecting = false;
290-
let mut chan_b_reconnecting = false;
290+
let mut ba_events = Vec::new();
291+
let mut bc_events = Vec::new();
291292

292293
macro_rules! test_err {
293294
($res: expr) => {
@@ -363,13 +364,18 @@ pub fn do_test(data: &[u8]) {
363364

364365
macro_rules! process_msg_events {
365366
($node: expr, $corrupt_forward: expr) => { {
366-
for event in nodes[$node].get_and_clear_pending_msg_events() {
367+
let events = if $node == 1 {
368+
let mut new_events = Vec::new();
369+
mem::swap(&mut new_events, &mut ba_events);
370+
new_events.extend_from_slice(&bc_events[..]);
371+
bc_events.clear();
372+
new_events
373+
} else { Vec::new() };
374+
for event in events.iter().chain(nodes[$node].get_and_clear_pending_msg_events().iter()) {
367375
match event {
368376
events::MessageSendEvent::UpdateHTLCs { ref node_id, updates: CommitmentUpdate { ref update_add_htlcs, ref update_fail_htlcs, ref update_fulfill_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
369-
for (idx, dest) in nodes.iter().enumerate() {
370-
if dest.get_our_node_id() == *node_id &&
371-
(($node != 0 && idx != 0) || !chan_a_disconnected) &&
372-
(($node != 2 && idx != 2) || !chan_b_disconnected) {
377+
for dest in nodes.iter() {
378+
if dest.get_our_node_id() == *node_id {
373379
assert!(update_fee.is_none());
374380
for update_add in update_add_htlcs {
375381
if !$corrupt_forward {
@@ -399,25 +405,16 @@ pub fn do_test(data: &[u8]) {
399405
}
400406
},
401407
events::MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
402-
for (idx, dest) in nodes.iter().enumerate() {
403-
if dest.get_our_node_id() == *node_id &&
404-
(($node != 0 && idx != 0) || !chan_a_disconnected) &&
405-
(($node != 2 && idx != 2) || !chan_b_disconnected) {
408+
for dest in nodes.iter() {
409+
if dest.get_our_node_id() == *node_id {
406410
test_err!(dest.handle_revoke_and_ack(&nodes[$node].get_our_node_id(), msg));
407411
}
408412
}
409413
},
410414
events::MessageSendEvent::SendChannelReestablish { ref node_id, ref msg } => {
411-
for (idx, dest) in nodes.iter().enumerate() {
415+
for dest in nodes.iter() {
412416
if dest.get_our_node_id() == *node_id {
413417
test_err!(dest.handle_channel_reestablish(&nodes[$node].get_our_node_id(), msg));
414-
if $node == 0 || idx == 0 {
415-
chan_a_reconnecting = false;
416-
chan_a_disconnected = false;
417-
} else {
418-
chan_b_reconnecting = false;
419-
chan_b_disconnected = false;
420-
}
421418
}
422419
}
423420
},
@@ -434,6 +431,56 @@ pub fn do_test(data: &[u8]) {
434431
} }
435432
}
436433

434+
macro_rules! drain_msg_events_on_disconnect {
435+
($counterparty_id: expr) => { {
436+
if $counterparty_id == 0 {
437+
for event in nodes[0].get_and_clear_pending_msg_events() {
438+
match event {
439+
events::MessageSendEvent::UpdateHTLCs { .. } => {},
440+
events::MessageSendEvent::SendRevokeAndACK { .. } => {},
441+
events::MessageSendEvent::SendChannelReestablish { .. } => {},
442+
events::MessageSendEvent::SendFundingLocked { .. } => {},
443+
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
444+
_ => panic!("Unhandled message event"),
445+
}
446+
}
447+
ba_events.clear();
448+
} else {
449+
for event in nodes[2].get_and_clear_pending_msg_events() {
450+
match event {
451+
events::MessageSendEvent::UpdateHTLCs { .. } => {},
452+
events::MessageSendEvent::SendRevokeAndACK { .. } => {},
453+
events::MessageSendEvent::SendChannelReestablish { .. } => {},
454+
events::MessageSendEvent::SendFundingLocked { .. } => {},
455+
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
456+
_ => panic!("Unhandled message event"),
457+
}
458+
}
459+
bc_events.clear();
460+
}
461+
let mut events = nodes[1].get_and_clear_pending_msg_events();
462+
let drop_node_id = if $counterparty_id == 0 { nodes[0].get_our_node_id() } else { nodes[2].get_our_node_id() };
463+
let msg_sink = if $counterparty_id == 0 { &mut bc_events } else { &mut ba_events };
464+
for event in events.drain(..) {
465+
let push = match event {
466+
events::MessageSendEvent::UpdateHTLCs { ref node_id, .. } => {
467+
if *node_id != drop_node_id { true } else { false }
468+
},
469+
events::MessageSendEvent::SendRevokeAndACK { ref node_id, .. } => {
470+
if *node_id != drop_node_id { true } else { false }
471+
},
472+
events::MessageSendEvent::SendChannelReestablish { ref node_id, .. } => {
473+
if *node_id != drop_node_id { true } else { false }
474+
},
475+
events::MessageSendEvent::SendFundingLocked { .. } => false,
476+
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => false,
477+
_ => panic!("Unhandled message event"),
478+
};
479+
if push { msg_sink.push(event); }
480+
}
481+
} }
482+
}
483+
437484
macro_rules! process_events {
438485
($node: expr, $fail: expr) => { {
439486
// In case we get 256 payments we may have a hash collision, resulting in the
@@ -500,27 +547,29 @@ pub fn do_test(data: &[u8]) {
500547
nodes[0].peer_disconnected(&nodes[1].get_our_node_id(), false);
501548
nodes[1].peer_disconnected(&nodes[0].get_our_node_id(), false);
502549
chan_a_disconnected = true;
550+
drain_msg_events_on_disconnect!(0);
503551
}
504552
},
505553
0x10 => {
506554
if !chan_b_disconnected {
507555
nodes[1].peer_disconnected(&nodes[2].get_our_node_id(), false);
508556
nodes[2].peer_disconnected(&nodes[1].get_our_node_id(), false);
509557
chan_b_disconnected = true;
558+
drain_msg_events_on_disconnect!(2);
510559
}
511560
},
512561
0x11 => {
513-
if chan_a_disconnected && !chan_a_reconnecting {
562+
if chan_a_disconnected {
514563
nodes[0].peer_connected(&nodes[1].get_our_node_id());
515564
nodes[1].peer_connected(&nodes[0].get_our_node_id());
516-
chan_a_reconnecting = true;
565+
chan_a_disconnected = false;
517566
}
518567
},
519568
0x12 => {
520-
if chan_b_disconnected && !chan_b_reconnecting {
569+
if chan_b_disconnected {
521570
nodes[1].peer_connected(&nodes[2].get_our_node_id());
522571
nodes[2].peer_connected(&nodes[1].get_our_node_id());
523-
chan_b_reconnecting = true;
572+
chan_b_disconnected = false;
524573
}
525574
},
526575
0x13 => process_msg_events!(0, true),

0 commit comments

Comments
 (0)