@@ -1039,6 +1039,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1039
1039
self . enqueue_message ( peer, & msgs:: WarningMessage { channel_id : [ 0 ; 32 ] , data : "Unreadable/bogus gossip message" . to_owned ( ) } ) ;
1040
1040
continue ;
1041
1041
}
1042
+ ( _, Some ( ty) ) if is_onion_message ( ty) => {
1043
+ log_debug ! ( self . logger, "Got an invalid value while deserializing an onion message" ) ;
1044
+ continue ;
1045
+ }
1042
1046
( msgs:: DecodeError :: UnknownRequiredFeature , ty) => {
1043
1047
log_gossip ! ( self . logger, "Received a message with an unknown required feature flag or TLV, you may want to update!" ) ;
1044
1048
self . enqueue_message ( peer, & msgs:: WarningMessage { channel_id : [ 0 ; 32 ] , data : format ! ( "Received an unknown required feature/TLV in message type {:?}" , ty) } ) ;
@@ -1869,11 +1873,19 @@ fn is_gossip_msg(type_id: u16) -> bool {
1869
1873
}
1870
1874
}
1871
1875
1876
+ fn is_onion_message ( type_id : u16 ) -> bool {
1877
+ match type_id {
1878
+ msgs:: OnionMessage :: TYPE => true ,
1879
+ _ => false
1880
+ }
1881
+ }
1882
+
1872
1883
#[ cfg( test) ]
1873
1884
mod tests {
1874
1885
use ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler , filter_addresses} ;
1875
1886
use ln:: { msgs, wire} ;
1876
1887
use ln:: msgs:: NetAddress ;
1888
+ use onion_message;
1877
1889
use util:: events;
1878
1890
use util:: test_utils;
1879
1891
@@ -2014,6 +2026,45 @@ mod tests {
2014
2026
assert_eq ! ( peers[ 1 ] . read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2015
2027
}
2016
2028
2029
+ #[ test]
2030
+ fn test_invalid_onion_message ( ) {
2031
+ // Check that we will drop invalid onion messages without disconnecting the peer.
2032
+ let cfgs = create_peermgr_cfgs ( 2 ) ;
2033
+ let a_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2034
+ let b_chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
2035
+ let mut peers = create_network ( 2 , & cfgs) ;
2036
+ let ( fd_a, mut fd_b) = establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
2037
+ assert_eq ! ( peers[ 0 ] . peers. read( ) . unwrap( ) . len( ) , 1 ) ;
2038
+
2039
+ let secp_ctx = Secp256k1 :: new ( ) ;
2040
+ let their_id = PublicKey :: from_secret_key ( & secp_ctx, & peers[ 1 ] . our_node_secret ) ;
2041
+
2042
+ let invalid_onion_msg = msgs:: OnionMessage {
2043
+ blinding_point : PublicKey :: from_secret_key ( & secp_ctx, & peers[ 1 ] . our_node_secret ) ,
2044
+ len : 42 ,
2045
+ onion_routing_packet : onion_message:: Packet {
2046
+ version : 0 ,
2047
+ public_key : PublicKey :: from_secret_key ( & secp_ctx, & peers[ 1 ] . our_node_secret ) ,
2048
+ hop_data : Vec :: new ( ) ,
2049
+ hmac : [ 0 ; 32 ] ,
2050
+ } ,
2051
+ } ;
2052
+ a_chan_handler. pending_events . lock ( ) . unwrap ( ) . push ( events:: MessageSendEvent :: SendOnionMessage {
2053
+ node_id : their_id, msg : invalid_onion_msg. clone ( )
2054
+ } ) ;
2055
+ peers[ 0 ] . message_handler . chan_handler = & a_chan_handler;
2056
+ peers[ 1 ] . message_handler . chan_handler = & b_chan_handler;
2057
+ peers[ 0 ] . process_events ( ) ;
2058
+
2059
+ let a_data = fd_a. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2060
+ assert_eq ! ( peers[ 1 ] . read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2061
+
2062
+ peers[ 1 ] . logger . assert_log_contains (
2063
+ "lightning::ln::peer_handler" . to_string ( ) ,
2064
+ "Got an invalid value while deserializing an onion message" . to_string ( ) , 1 ) ;
2065
+ assert_eq ! ( peers[ 1 ] . peers. read( ) . unwrap( ) . len( ) , 1 ) ;
2066
+ }
2067
+
2017
2068
#[ test]
2018
2069
fn test_disconnect_all_peer ( ) {
2019
2070
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
0 commit comments