Skip to content

Commit ca3f90c

Browse files
committed
Check unknown features compared to handlers
Each message handler provides which features it supports. A custom message handler may support unknown features. Our own handler's unknown features must therefore be removed before checking if our peer requires unknown features.
1 parent 94f2cd2 commit ca3f90c

File tree

1 file changed

+99
-7
lines changed

1 file changed

+99
-7
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 99 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,7 +1346,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
13461346

13471347
// Need an Init as first message
13481348
if let wire::Message::Init(msg) = message {
1349-
if msg.features.requires_unknown_bits() {
1349+
let additional_features = msg.features.clone() - self.init_features(&their_node_id);
1350+
if additional_features.requires_unknown_bits() {
13501351
log_debug!(self.logger, "Peer features required unknown version bits");
13511352
return Err(PeerHandleError { }.into());
13521353
}
@@ -2221,16 +2222,19 @@ fn is_gossip_msg(type_id: u16) -> bool {
22212222
mod tests {
22222223
use crate::chain::keysinterface::{NodeSigner, Recipient};
22232224
use crate::events;
2225+
use crate::io;
2226+
use crate::ln::features::{InitFeatures, NodeFeatures};
22242227
use crate::ln::peer_channel_encryptor::PeerChannelEncryptor;
2225-
use crate::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses};
2228+
use crate::ln::peer_handler::{CustomMessageHandler, PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses};
22262229
use crate::ln::{msgs, wire};
2227-
use crate::ln::msgs::NetAddress;
2230+
use crate::ln::msgs::{LightningError, NetAddress};
22282231
use crate::util::test_utils;
22292232

2230-
use bitcoin::secp256k1::SecretKey;
2233+
use bitcoin::secp256k1::{PublicKey, SecretKey};
22312234

22322235
use crate::prelude::*;
22332236
use crate::sync::{Arc, Mutex};
2237+
use core::convert::Infallible;
22342238
use core::sync::atomic::{AtomicBool, Ordering};
22352239

22362240
#[derive(Clone)]
@@ -2263,19 +2267,51 @@ mod tests {
22632267
struct PeerManagerCfg {
22642268
chan_handler: test_utils::TestChannelMessageHandler,
22652269
routing_handler: test_utils::TestRoutingMessageHandler,
2270+
custom_handler: TestCustomMessageHandler,
22662271
logger: test_utils::TestLogger,
22672272
node_signer: test_utils::TestNodeSigner,
22682273
}
22692274

2275+
struct TestCustomMessageHandler {
2276+
features: InitFeatures,
2277+
}
2278+
2279+
impl wire::CustomMessageReader for TestCustomMessageHandler {
2280+
type CustomMessage = Infallible;
2281+
fn read<R: io::Read>(&self, _: u16, _: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
2282+
Ok(None)
2283+
}
2284+
}
2285+
2286+
impl CustomMessageHandler for TestCustomMessageHandler {
2287+
fn handle_custom_message(&self, _: Infallible, _: &PublicKey) -> Result<(), LightningError> {
2288+
unreachable!();
2289+
}
2290+
2291+
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { Vec::new() }
2292+
2293+
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
2294+
2295+
fn provided_init_features(&self, _: &PublicKey) -> InitFeatures {
2296+
self.features.clone()
2297+
}
2298+
}
2299+
22702300
fn create_peermgr_cfgs(peer_count: usize) -> Vec<PeerManagerCfg> {
22712301
let mut cfgs = Vec::new();
22722302
for i in 0..peer_count {
22732303
let node_secret = SecretKey::from_slice(&[42 + i as u8; 32]).unwrap();
2304+
let features = {
2305+
let mut feature_bits = vec![0u8; 33];
2306+
feature_bits[32] = 0b00000001;
2307+
InitFeatures::from_le_bytes(feature_bits)
2308+
};
22742309
cfgs.push(
22752310
PeerManagerCfg{
22762311
chan_handler: test_utils::TestChannelMessageHandler::new(),
22772312
logger: test_utils::TestLogger::new(),
22782313
routing_handler: test_utils::TestRoutingMessageHandler::new(),
2314+
custom_handler: TestCustomMessageHandler { features },
22792315
node_signer: test_utils::TestNodeSigner::new(node_secret),
22802316
}
22812317
);
@@ -2284,19 +2320,42 @@ mod tests {
22842320
cfgs
22852321
}
22862322

2287-
fn create_network<'a>(peer_count: usize, cfgs: &'a Vec<PeerManagerCfg>) -> Vec<PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, IgnoringMessageHandler, &'a test_utils::TestNodeSigner>> {
2323+
fn create_incompatible_peermgr_cfgs(peer_count: usize) -> Vec<PeerManagerCfg> {
2324+
let mut cfgs = Vec::new();
2325+
for i in 0..peer_count {
2326+
let node_secret = SecretKey::from_slice(&[42 + i as u8; 32]).unwrap();
2327+
let features = {
2328+
let mut feature_bits = vec![0u8; 32 + i + 1];
2329+
feature_bits[32 + i] = 0b00000001;
2330+
InitFeatures::from_le_bytes(feature_bits)
2331+
};
2332+
cfgs.push(
2333+
PeerManagerCfg{
2334+
chan_handler: test_utils::TestChannelMessageHandler::new(),
2335+
logger: test_utils::TestLogger::new(),
2336+
routing_handler: test_utils::TestRoutingMessageHandler::new(),
2337+
custom_handler: TestCustomMessageHandler { features },
2338+
node_signer: test_utils::TestNodeSigner::new(node_secret),
2339+
}
2340+
);
2341+
}
2342+
2343+
cfgs
2344+
}
2345+
2346+
fn create_network<'a>(peer_count: usize, cfgs: &'a Vec<PeerManagerCfg>) -> Vec<PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, &'a TestCustomMessageHandler, &'a test_utils::TestNodeSigner>> {
22882347
let mut peers = Vec::new();
22892348
for i in 0..peer_count {
22902349
let ephemeral_bytes = [i as u8; 32];
22912350
let msg_handler = MessageHandler { chan_handler: &cfgs[i].chan_handler, route_handler: &cfgs[i].routing_handler, onion_message_handler: IgnoringMessageHandler {} };
2292-
let peer = PeerManager::new(msg_handler, 0, &ephemeral_bytes, &cfgs[i].logger, IgnoringMessageHandler {}, &cfgs[i].node_signer);
2351+
let peer = PeerManager::new(msg_handler, 0, &ephemeral_bytes, &cfgs[i].logger, &cfgs[i].custom_handler, &cfgs[i].node_signer);
22932352
peers.push(peer);
22942353
}
22952354

22962355
peers
22972356
}
22982357

2299-
fn establish_connection<'a>(peer_a: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, IgnoringMessageHandler, &'a test_utils::TestNodeSigner>, peer_b: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, IgnoringMessageHandler, &'a test_utils::TestNodeSigner>) -> (FileDescriptor, FileDescriptor) {
2358+
fn establish_connection<'a>(peer_a: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, &'a TestCustomMessageHandler, &'a test_utils::TestNodeSigner>, peer_b: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, &'a TestCustomMessageHandler, &'a test_utils::TestNodeSigner>) -> (FileDescriptor, FileDescriptor) {
23002359
let id_a = peer_a.node_signer.get_node_id(Recipient::Node).unwrap();
23012360
let mut fd_a = FileDescriptor {
23022361
fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())),
@@ -2411,6 +2470,39 @@ mod tests {
24112470
thrd_b.join().unwrap();
24122471
}
24132472

2473+
#[test]
2474+
fn test_incompatible_peers() {
2475+
let cfgs = create_incompatible_peermgr_cfgs(2);
2476+
let peers = create_network(2, &cfgs);
2477+
let peer_a = &peers[0];
2478+
let peer_b = &peers[1];
2479+
2480+
let id_a = peer_a.node_signer.get_node_id(Recipient::Node).unwrap();
2481+
let mut fd_a = FileDescriptor {
2482+
fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())),
2483+
disconnect: Arc::new(AtomicBool::new(false)),
2484+
};
2485+
let addr_a = NetAddress::IPv4{addr: [127, 0, 0, 1], port: 1000};
2486+
let mut fd_b = FileDescriptor {
2487+
fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())),
2488+
disconnect: Arc::new(AtomicBool::new(false)),
2489+
};
2490+
let addr_b = NetAddress::IPv4{addr: [127, 0, 0, 1], port: 1001};
2491+
let initial_data = peer_b.new_outbound_connection(id_a, fd_b.clone(), Some(addr_a.clone())).unwrap();
2492+
peer_a.new_inbound_connection(fd_a.clone(), Some(addr_b.clone())).unwrap();
2493+
assert_eq!(peer_a.read_event(&mut fd_a, &initial_data).unwrap(), false);
2494+
peer_a.process_events();
2495+
2496+
let a_data = fd_a.outbound_data.lock().unwrap().split_off(0);
2497+
assert_eq!(peer_b.read_event(&mut fd_b, &a_data).unwrap(), false);
2498+
2499+
peer_b.process_events();
2500+
let b_data = fd_b.outbound_data.lock().unwrap().split_off(0);
2501+
2502+
// Should fail because of unknown required features
2503+
assert!(peer_a.read_event(&mut fd_a, &b_data).is_err());
2504+
}
2505+
24142506
#[test]
24152507
fn test_disconnect_peer() {
24162508
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and

0 commit comments

Comments
 (0)