Ignore invalid lnd msgs by matching DecodeError instead of a macro
authorMatt Corallo <git@bluematt.me>
Wed, 29 Aug 2018 19:36:58 +0000 (15:36 -0400)
committerMatt Corallo <git@bluematt.me>
Wed, 29 Aug 2018 21:57:40 +0000 (17:57 -0400)
src/ln/peer_handler.rs

index 9315f56902d767339285d146235c18f62cffb982..7af4c0e29f2c1f36f38f71237b01ae5e0fb91a20 100644 (file)
@@ -331,21 +331,19 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                                ($thing: expr) => {
                                                                        match $thing {
                                                                                Ok(x) => x,
-                                                                               Err(_e) => {
-                                                                                       //TODO: Handle e?
-                                                                                       return Err(PeerHandleError{ no_connection_possible: false });
-                                                                               }
-                                                                       };
-                                                               }
-                                                       }
-
-                                                       macro_rules! try_ignore_potential_decodeerror {
-                                                               ($thing: expr) => {
-                                                                       match $thing {
-                                                                               Ok(x) => x,
-                                                                               Err(_e) => {
-                                                                                       log_debug!(self, "Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");
-                                                                                       continue;
+                                                                               Err(e) => {
+                                                                                       match e {
+                                                                                               msgs::DecodeError::UnknownRealmByte => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                               msgs::DecodeError::BadPublicKey => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                               msgs::DecodeError::BadSignature => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                               msgs::DecodeError::BadText => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                               msgs::DecodeError::ShortRead => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                               msgs::DecodeError::ExtraAddressesPerType => {
+                                                                                                       log_debug!(self, "Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");
+                                                                                                       continue;
+                                                                                               },
+                                                                                               msgs::DecodeError::BadLengthDescriptor => return Err(PeerHandleError{ no_connection_possible: false }),
+                                                                                       }
                                                                                }
                                                                        };
                                                                }
@@ -576,7 +574,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                                                                }
                                                                                        },
                                                                                        257 => {
-                                                                                               let msg = try_ignore_potential_decodeerror!(msgs::NodeAnnouncement::decode(&msg_data[2..]));
+                                                                                               let msg = try_potential_decodeerror!(msgs::NodeAnnouncement::decode(&msg_data[2..]));
                                                                                                try_potential_handleerror!(self.message_handler.route_handler.handle_node_announcement(&msg));
                                                                                        },
                                                                                        258 => {