Skip to content

Commit 4e8167b

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 5e85c91 commit 4e8167b

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

fuzz/src/full_stack.rs

+50-2
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;
@@ -505,6 +505,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
505505

506506
let mut should_forward = false;
507507
let mut payments_received: Vec<PaymentHash> = Vec::new();
508+
let mut intercepted_htlcs: Vec<InterceptId> = Vec::new();
508509
let mut payments_sent: u16 = 0;
509510
let mut pending_funding_generation: Vec<(ChannelId, PublicKey, u64, ScriptBuf)> = Vec::new();
510511
let mut pending_funding_signatures = HashMap::new();
@@ -580,6 +581,19 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
580581
PaymentId(payment_hash.0), params, Retry::Attempts(2)
581582
);
582583
},
584+
17 => {
585+
let final_value_msat = slice_to_be24(get_slice!(3)) as u64;
586+
let payment_params = PaymentParameters::from_node_id(get_pubkey!(), 42);
587+
let params = RouteParameters::from_payment_params_and_value(
588+
payment_params, final_value_msat);
589+
let _ = channelmanager.send_preflight_probes(params, None);
590+
},
591+
18 => {
592+
let idx = u16::from_be_bytes(get_bytes!(2)) % cmp::max(payments_sent, 1);
593+
let mut payment_id = PaymentId([0; 32]);
594+
payment_id.0[0..2].copy_from_slice(&idx.to_be_bytes());
595+
channelmanager.abandon_payment(payment_id);
596+
},
583597
5 => {
584598
let peer_id = get_slice!(1)[0];
585599
if !peers.borrow()[peer_id as usize] { return; }
@@ -712,7 +726,36 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
712726
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
713727
channelmanager.force_close_broadcasting_latest_txn(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).unwrap();
714728
},
715-
// 15 is above
729+
// 15, 16, 17, 18 is above
730+
19 => {
731+
let mut list = loss_detector.handler.get_peer_node_ids();
732+
list.sort_by_key(|v| v.0);
733+
if let Some((id, _)) = list.get(0) {
734+
loss_detector.handler.disconnect_by_node_id(*id);
735+
}
736+
},
737+
20 => loss_detector.handler.disconnect_all_peers(),
738+
21 => loss_detector.handler.timer_tick_occurred(),
739+
22 =>
740+
loss_detector.handler.broadcast_node_announcement([42; 3], [43; 32], Vec::new()),
741+
32 => channelmanager.timer_tick_occurred(),
742+
33 => {
743+
for id in intercepted_htlcs.drain(..) {
744+
channelmanager.fail_intercepted_htlc(id).unwrap();
745+
}
746+
}
747+
34 => {
748+
let amt = u64::from_be_bytes(get_bytes!(8));
749+
let chans = channelmanager.list_channels();
750+
for id in intercepted_htlcs.drain(..) {
751+
if chans.is_empty() {
752+
channelmanager.fail_intercepted_htlc(id).unwrap();
753+
} else {
754+
let chan = &chans[amt as usize % chans.len()];
755+
channelmanager.forward_intercepted_htlc(id, &chan.channel_id, chan.counterparty.node_id, amt).unwrap();
756+
}
757+
}
758+
}
716759
_ => return,
717760
}
718761
loss_detector.handler.process_events();
@@ -728,6 +771,11 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
728771
Event::PendingHTLCsForwardable {..} => {
729772
should_forward = true;
730773
},
774+
Event::HTLCIntercepted { intercept_id, .. } => {
775+
if !intercepted_htlcs.contains(&intercept_id) {
776+
intercepted_htlcs.push(intercept_id);
777+
}
778+
},
731779
_ => {},
732780
}
733781
}

0 commit comments

Comments
 (0)