[Router] Remove channels from nodes when the channel is failed 2018-08-router-crashes-2
authorMatt Corallo <git@bluematt.me>
Thu, 16 Aug 2018 14:17:33 +0000 (10:17 -0400)
committerMatt Corallo <git@bluematt.me>
Fri, 17 Aug 2018 00:51:50 +0000 (20:51 -0400)
Found by fuzzer

src/ln/router.rs

index bc9c868add32b948052df9b9cc9a4e6a6213b590..f4bf32a042513c5582b22c2d38387dd8029afc67 100644 (file)
@@ -89,6 +89,18 @@ impl NetworkMap {
        fn get_key(short_channel_id: u64, _: Sha256dHash) -> u64 {
                short_channel_id
        }
+
+       #[cfg(feature = "non_bitcoin_chain_hash_routing")]
+       #[inline]
+       fn get_short_id(id: &(u64, Sha256dHash)) -> &u64 {
+               &id.0
+       }
+
+       #[cfg(not(feature = "non_bitcoin_chain_hash_routing"))]
+       #[inline]
+       fn get_short_id(id: &u64) -> &u64 {
+               id
+       }
 }
 
 /// A channel descriptor which provides a last-hop route to get_route
@@ -224,7 +236,14 @@ impl RoutingMessageHandler for Router {
                        },
                        &msgs::HTLCFailChannelUpdate::ChannelClosed { ref short_channel_id } => {
                                let mut network = self.network_map.write().unwrap();
-                               network.channels.remove(short_channel_id);
+                               if let Some(chan) = network.channels.remove(short_channel_id) {
+                                       network.nodes.get_mut(&chan.one_to_two.src_node_id).unwrap().channels.retain(|chan_id| {
+                                               chan_id != NetworkMap::get_short_id(chan_id)
+                                       });
+                                       network.nodes.get_mut(&chan.two_to_one.src_node_id).unwrap().channels.retain(|chan_id| {
+                                               chan_id != NetworkMap::get_short_id(chan_id)
+                                       });
+                               }
                        },
                }
        }