Skip to content

Commit 5da7871

Browse files
committed
Merge branch 'main' into custom-fail-back-err
2 parents 41661e0 + 01fe9ba commit 5da7871

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1817
-1543
lines changed

fuzz/Cargo.toml

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ libfuzzer_fuzz = ["libfuzzer-sys"]
1818
stdin_fuzz = []
1919

2020
[dependencies]
21-
afl = { version = "0.4", optional = true }
22-
lightning = { path = "../lightning", features = ["regex"] }
21+
lightning = { path = "../lightning", features = ["regex", "hashbrown"] }
2322
lightning-rapid-gossip-sync = { path = "../lightning-rapid-gossip-sync" }
2423
bitcoin = { version = "0.29.0", features = ["secp-lowmemory"] }
2524
hex = "0.3"
25+
hashbrown = "0.8"
26+
27+
afl = { version = "0.12", optional = true }
2628
honggfuzz = { version = "0.5", optional = true, default-features = false }
2729
libfuzzer-sys = { version = "0.4", optional = true }
2830

@@ -36,6 +38,8 @@ members = ["."]
3638
[profile.release]
3739
lto = true
3840
codegen-units = 1
41+
debug-assertions = true
42+
overflow-checks = true
3943

4044
# When testing a large fuzz corpus, -O1 offers a nice speedup
4145
[profile.dev]

fuzz/src/chanmon_consistency.rs

+28-28
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, chainmonitor, chan
3636
use lightning::chain::channelmonitor::{ChannelMonitor, MonitorEvent};
3737
use lightning::chain::transaction::OutPoint;
3838
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
39-
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient, EntropySource, NodeSigner, SignerProvider};
39+
use lightning::chain::keysinterface::{KeyMaterial, InMemorySigner, Recipient, EntropySource, NodeSigner, SignerProvider};
4040
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
41-
use lightning::ln::channelmanager::{self, ChainParameters, ChannelDetails, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
41+
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
4242
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4343
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
4444
use lightning::ln::script::ShutdownScript;
@@ -61,7 +61,7 @@ use bitcoin::secp256k1::Secp256k1;
6161

6262
use std::mem;
6363
use std::cmp::{self, Ordering};
64-
use std::collections::{HashSet, hash_map, HashMap};
64+
use hashbrown::{HashSet, hash_map, HashMap};
6565
use std::sync::{Arc,Mutex};
6666
use std::sync::atomic;
6767
use std::io::Cursor;
@@ -159,7 +159,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
159159
hash_map::Entry::Vacant(_) => panic!("Didn't have monitor on update call"),
160160
};
161161
let deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::
162-
read(&mut Cursor::new(&map_entry.get().1), &*self.keys).unwrap().1;
162+
read(&mut Cursor::new(&map_entry.get().1), (&*self.keys, &*self.keys)).unwrap().1;
163163
deserialized_monitor.update_monitor(&update, &&TestBroadcaster{}, &FuzzEstimator { ret_val: atomic::AtomicU32::new(253) }, &self.logger).unwrap();
164164
let mut ser = VecWriter(Vec::new());
165165
deserialized_monitor.write(&mut ser).unwrap();
@@ -270,8 +270,6 @@ impl SignerProvider for KeyProvider {
270270
}
271271
}
272272

273-
impl KeysInterface for KeyProvider {}
274-
275273
impl KeyProvider {
276274
fn make_enforcement_state_cell(&self, commitment_seed: [u8; 32]) -> Arc<Mutex<EnforcementState>> {
277275
let mut revoked_commitments = self.enforcement_states.lock().unwrap();
@@ -328,7 +326,7 @@ fn check_payment_err(send_err: PaymentSendFailure) {
328326
}
329327
}
330328

331-
type ChanMan<'a> = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
329+
type ChanMan<'a> = ChannelManager<Arc<TestChainMonitor>, Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<KeyProvider>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
332330

333331
#[inline]
334332
fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(PaymentSecret, PaymentHash)> {
@@ -353,9 +351,9 @@ fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, p
353351
if let Err(err) = source.send_payment(&Route {
354352
paths: vec![vec![RouteHop {
355353
pubkey: dest.get_our_node_id(),
356-
node_features: channelmanager::provided_node_features(),
354+
node_features: dest.node_features(),
357355
short_channel_id: dest_chan_id,
358-
channel_features: channelmanager::provided_channel_features(),
356+
channel_features: dest.channel_features(),
359357
fee_msat: amt,
360358
cltv_expiry_delta: 200,
361359
}]],
@@ -375,16 +373,16 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
375373
if let Err(err) = source.send_payment(&Route {
376374
paths: vec![vec![RouteHop {
377375
pubkey: middle.get_our_node_id(),
378-
node_features: channelmanager::provided_node_features(),
376+
node_features: middle.node_features(),
379377
short_channel_id: middle_chan_id,
380-
channel_features: channelmanager::provided_channel_features(),
378+
channel_features: middle.channel_features(),
381379
fee_msat: 50000,
382380
cltv_expiry_delta: 100,
383381
},RouteHop {
384382
pubkey: dest.get_our_node_id(),
385-
node_features: channelmanager::provided_node_features(),
383+
node_features: dest.node_features(),
386384
short_channel_id: dest_chan_id,
387-
channel_features: channelmanager::provided_channel_features(),
385+
channel_features: dest.channel_features(),
388386
fee_msat: amt,
389387
cltv_expiry_delta: 200,
390388
}]],
@@ -418,7 +416,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
418416
network,
419417
best_block: BestBlock::from_genesis(network),
420418
};
421-
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), config, params),
419+
(ChannelManager::new($fee_estimator.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params),
422420
monitor, keys_manager)
423421
} }
424422
}
@@ -439,7 +437,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
439437
let mut monitors = HashMap::new();
440438
let mut old_monitors = $old_monitors.latest_monitors.lock().unwrap();
441439
for (outpoint, (update_id, monitor_ser)) in old_monitors.drain() {
442-
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&monitor_ser), &*$keys_manager).expect("Failed to read monitor").1);
440+
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&monitor_ser), (&*$keys_manager, &*$keys_manager)).expect("Failed to read monitor").1);
443441
chain_monitor.latest_monitors.lock().unwrap().insert(outpoint, (update_id, monitor_ser));
444442
}
445443
let mut monitor_refs = HashMap::new();
@@ -448,7 +446,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
448446
}
449447

450448
let read_args = ChannelManagerReadArgs {
451-
keys_manager,
449+
entropy_source: keys_manager.clone(),
450+
node_signer: keys_manager.clone(),
451+
signer_provider: keys_manager.clone(),
452452
fee_estimator: $fee_estimator.clone(),
453453
chain_monitor: chain_monitor.clone(),
454454
tx_broadcaster: broadcast.clone(),
@@ -470,8 +470,8 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
470470
let mut channel_txn = Vec::new();
471471
macro_rules! make_channel {
472472
($source: expr, $dest: expr, $chan_id: expr) => { {
473-
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
474-
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
473+
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: $dest.init_features(), remote_network_address: None }).unwrap();
474+
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: $source.init_features(), remote_network_address: None }).unwrap();
475475

476476
$source.create_channel($dest.get_our_node_id(), 100_000, 42, 0, None).unwrap();
477477
let open_channel = {
@@ -482,7 +482,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
482482
} else { panic!("Wrong event type"); }
483483
};
484484

485-
$dest.handle_open_channel(&$source.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
485+
$dest.handle_open_channel(&$source.get_our_node_id(), &open_channel);
486486
let accept_channel = {
487487
let events = $dest.get_and_clear_pending_msg_events();
488488
assert_eq!(events.len(), 1);
@@ -491,7 +491,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
491491
} else { panic!("Wrong event type"); }
492492
};
493493

494-
$source.handle_accept_channel(&$dest.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
494+
$source.handle_accept_channel(&$dest.get_our_node_id(), &accept_channel);
495495
let funding_output;
496496
{
497497
let events = $source.get_and_clear_pending_events();
@@ -990,15 +990,15 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
990990
},
991991
0x0e => {
992992
if chan_a_disconnected {
993-
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
994-
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
993+
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
994+
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }).unwrap();
995995
chan_a_disconnected = false;
996996
}
997997
},
998998
0x0f => {
999999
if chan_b_disconnected {
1000-
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1001-
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1000+
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }).unwrap();
1001+
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
10021002
chan_b_disconnected = false;
10031003
}
10041004
},
@@ -1193,13 +1193,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
11931193

11941194
// Next, make sure peers are all connected to each other
11951195
if chan_a_disconnected {
1196-
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1197-
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1196+
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
1197+
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }).unwrap();
11981198
chan_a_disconnected = false;
11991199
}
12001200
if chan_b_disconnected {
1201-
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1202-
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
1201+
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }).unwrap();
1202+
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
12031203
chan_b_disconnected = false;
12041204
}
12051205

fuzz/src/chanmon_deser.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ impl Writer for VecWriter {
2222

2323
#[inline]
2424
pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
25-
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(data), &OnlyReadsKeysInterface {}) {
25+
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(data), (&OnlyReadsKeysInterface {}, &OnlyReadsKeysInterface {})) {
2626
let mut w = VecWriter(Vec::new());
2727
monitor.write(&mut w).unwrap();
28-
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
28+
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&w.0), (&OnlyReadsKeysInterface {}, &OnlyReadsKeysInterface {})).unwrap();
2929
assert!(latest_block_hash == deserialized_copy.0);
3030
assert!(monitor == deserialized_copy.1);
3131
}

fuzz/src/full_stack.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, Confirm, Listen};
3333
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
3434
use lightning::chain::chainmonitor;
3535
use lightning::chain::transaction::OutPoint;
36-
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, KeysInterface, EntropySource, NodeSigner, SignerProvider};
36+
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
3737
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
3838
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId};
3939
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
@@ -58,7 +58,7 @@ use bitcoin::secp256k1::ecdsa::RecoverableSignature;
5858
use bitcoin::secp256k1::Secp256k1;
5959

6060
use std::cell::RefCell;
61-
use std::collections::{HashMap, hash_map};
61+
use hashbrown::{HashMap, hash_map};
6262
use std::convert::TryInto;
6363
use std::cmp;
6464
use std::sync::{Arc, Mutex};
@@ -182,7 +182,7 @@ impl<'a> std::hash::Hash for Peer<'a> {
182182

183183
type ChannelMan<'a> = ChannelManager<
184184
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
185-
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
185+
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<KeyProvider>, Arc<KeyProvider>, Arc<FuzzEstimator>, &'a FuzzRouter, Arc<dyn Logger>>;
186186
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan<'a>>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, IgnoringMessageHandler, Arc<dyn Logger>, IgnoringMessageHandler>;
187187

188188
struct MoneyLossDetector<'a> {
@@ -387,8 +387,6 @@ impl SignerProvider for KeyProvider {
387387
}
388388
}
389389

390-
impl KeysInterface for KeyProvider {}
391-
392390
#[inline]
393391
pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
394392
let input = Arc::new(InputData {
@@ -443,8 +441,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
443441
network,
444442
best_block: BestBlock::from_genesis(network),
445443
};
446-
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), config, params));
447-
// Adding new calls to `KeysInterface::get_secure_random_bytes` during startup can change all the
444+
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), &router, Arc::clone(&logger), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), config, params));
445+
// Adding new calls to `EntropySource::get_secure_random_bytes` during startup can change all the
448446
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
449447
// it's easier to just increment the counter here so the keys don't change.
450448
keys_manager.counter.fetch_sub(3, Ordering::AcqRel);
@@ -634,7 +632,9 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
634632
// It's possible the channel has been closed in the mean time, but any other
635633
// failure may be a bug.
636634
if let APIError::ChannelUnavailable { err } = e {
637-
assert_eq!(err, "No such channel");
635+
if !err.starts_with("Can't find a peer matching the passed counterparty node_id ") {
636+
assert_eq!(err, "No such channel");
637+
}
638638
} else { panic!(); }
639639
}
640640
pending_funding_signatures.insert(funding_output, tx);

fuzz/src/onion_message.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
55
use bitcoin::secp256k1::ecdh::SharedSecret;
66
use bitcoin::secp256k1::ecdsa::RecoverableSignature;
77

8-
use lightning::chain::keysinterface::{Recipient, KeyMaterial, KeysInterface, EntropySource, NodeSigner, SignerProvider};
8+
use lightning::chain::keysinterface::{Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
99
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
1010
use lightning::ln::script::ShutdownScript;
1111
use lightning::util::enforcing_trait_impls::EnforcingSigner;
@@ -30,7 +30,7 @@ pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
3030
counter: AtomicU64::new(0),
3131
};
3232
let custom_msg_handler = TestCustomMessageHandler {};
33-
let onion_messenger = OnionMessenger::new(&keys_manager, logger, &custom_msg_handler);
33+
let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &custom_msg_handler);
3434
let mut pk = [2; 33]; pk[1] = 0xff;
3535
let peer_node_id_not_used = PublicKey::from_slice(&pk).unwrap();
3636
onion_messenger.handle_onion_message(&peer_node_id_not_used, &msg);
@@ -140,8 +140,6 @@ impl SignerProvider for KeyProvider {
140140
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript { unreachable!() }
141141
}
142142

143-
impl KeysInterface for KeyProvider {}
144-
145143
#[cfg(test)]
146144
mod tests {
147145
use lightning::util::logger::{Logger, Record};

fuzz/src/router.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use lightning::ln::msgs;
1818
use lightning::routing::gossip::{NetworkGraph, RoutingFees};
1919
use lightning::routing::router::{find_route, PaymentParameters, RouteHint, RouteHintHop, RouteParameters};
2020
use lightning::routing::scoring::FixedPenaltyScorer;
21+
use lightning::util::config::UserConfig;
2122
use lightning::util::ser::Readable;
2223

2324
use bitcoin::hashes::Hash;
@@ -28,7 +29,7 @@ use bitcoin::blockdata::constants::genesis_block;
2829
use crate::utils::test_logger;
2930

3031
use std::convert::TryInto;
31-
use std::collections::HashSet;
32+
use hashbrown::HashSet;
3233
use std::sync::Arc;
3334
use std::sync::atomic::{AtomicUsize, Ordering};
3435

@@ -210,7 +211,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
210211
channel_id: [0; 32],
211212
counterparty: ChannelCounterparty {
212213
node_id: *rnid,
213-
features: channelmanager::provided_init_features(),
214+
features: channelmanager::provided_init_features(&UserConfig::default()),
214215
unspendable_punishment_reserve: 0,
215216
forwarding_info: None,
216217
outbound_htlc_minimum_msat: None,

0 commit comments

Comments
 (0)