Skip to content

Commit fd2bce4

Browse files
committed
[fuzz] Add additional method calls in full_stack_target
The whole point of full_stack_target is to just expose our entire API to the fuzzer and see what happens. Sadly, we're really only exposing a small subset of our API. This improves that by exposing a handful of other assorted methods from ChannelManager and PeerManager.
1 parent 7091cbc commit fd2bce4

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

fuzz/src/full_stack.rs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use lightning::chain::transaction::OutPoint;
3737
use lightning::sign::{InMemorySigner, Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
3838
use lightning::events::Event;
3939
use lightning::ln::{ChannelId, PaymentHash, PaymentPreimage, PaymentSecret};
40-
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId, RecipientOnionFields, Retry};
40+
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId, RecipientOnionFields, Retry, InterceptId};
4141
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
4242
use lightning::ln::msgs::{self, DecodeError};
4343
use lightning::ln::script::ShutdownScript;
@@ -510,6 +510,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
510510

511511
let mut should_forward = false;
512512
let mut payments_received: Vec<PaymentHash> = Vec::new();
513+
let mut intercepted_htlcs: Vec<InterceptId> = Vec::new();
513514
let mut payments_sent: u16 = 0;
514515
let mut pending_funding_generation: Vec<(ChannelId, PublicKey, u64, ScriptBuf)> = Vec::new();
515516
let mut pending_funding_signatures = HashMap::new();
@@ -585,6 +586,19 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
585586
PaymentId(payment_hash.0), params, Retry::Attempts(2)
586587
);
587588
},
589+
17 => {
590+
let final_value_msat = slice_to_be24(get_slice!(3)) as u64;
591+
let payment_params = PaymentParameters::from_node_id(get_pubkey!(), 42);
592+
let params = RouteParameters::from_payment_params_and_value(
593+
payment_params, final_value_msat);
594+
let _ = channelmanager.send_preflight_probes(params, None);
595+
},
596+
18 => {
597+
let idx = u16::from_be_bytes(get_bytes!(2)) % cmp::max(payments_sent, 1);
598+
let mut payment_id = PaymentId([0; 32]);
599+
payment_id.0[0..2].copy_from_slice(&idx.to_be_bytes());
600+
channelmanager.abandon_payment(payment_id);
601+
},
588602
5 => {
589603
let peer_id = get_slice!(1)[0];
590604
if !peers.borrow()[peer_id as usize] { return; }
@@ -717,7 +731,36 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
717731
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
718732
channelmanager.force_close_broadcasting_latest_txn(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).unwrap();
719733
},
720-
// 15 is above
734+
// 15, 16, 17, 18 is above
735+
19 => {
736+
let mut list = loss_detector.handler.get_peer_node_ids();
737+
list.sort_by_key(|v| v.0);
738+
if let Some((id, _)) = list.get(0) {
739+
loss_detector.handler.disconnect_by_node_id(*id);
740+
}
741+
},
742+
20 => loss_detector.handler.disconnect_all_peers(),
743+
21 => loss_detector.handler.timer_tick_occurred(),
744+
22 =>
745+
loss_detector.handler.broadcast_node_announcement([42; 3], [43; 32], Vec::new()),
746+
32 => channelmanager.timer_tick_occurred(),
747+
33 => {
748+
for id in intercepted_htlcs.drain(..) {
749+
channelmanager.fail_intercepted_htlc(id).unwrap();
750+
}
751+
}
752+
34 => {
753+
let amt = u64::from_be_bytes(get_bytes!(8));
754+
let chans = channelmanager.list_channels();
755+
for id in intercepted_htlcs.drain(..) {
756+
if chans.is_empty() {
757+
channelmanager.fail_intercepted_htlc(id).unwrap();
758+
} else {
759+
let chan = &chans[amt as usize % chans.len()];
760+
channelmanager.forward_intercepted_htlc(id, &chan.channel_id, chan.counterparty.node_id, amt).unwrap();
761+
}
762+
}
763+
}
721764
_ => return,
722765
}
723766
loss_detector.handler.process_events();
@@ -733,6 +776,11 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
733776
Event::PendingHTLCsForwardable {..} => {
734777
should_forward = true;
735778
},
779+
Event::HTLCIntercepted { intercept_id, .. } => {
780+
if !intercepted_htlcs.contains(&intercept_id) {
781+
intercepted_htlcs.push(intercept_id);
782+
}
783+
},
736784
_ => {},
737785
}
738786
}

0 commit comments

Comments
 (0)