]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Merge pull request #197 from TheBlueMatt/master
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 29 Sep 2018 18:27:01 +0000 (14:27 -0400)
committerGitHub <noreply@github.com>
Sat, 29 Sep 2018 18:27:01 +0000 (14:27 -0400)
Fix fuzztarget failures

src/ln/channelmanager.rs
src/ln/channelmonitor.rs

index ba535d007bc0f8c64678a07008ba41ce6af53760..bcb928cca8f025ceb484b1a5dcaf594fe3158850 100644 (file)
@@ -365,9 +365,15 @@ impl ChannelManager {
                let channel = Channel::new_outbound(&*self.fee_estimator, chan_keys, their_network_key, channel_value_satoshis, push_msat, self.announce_channels_publicly, user_id, Arc::clone(&self.logger))?;
                let res = channel.get_open_channel(self.genesis_hash.clone(), &*self.fee_estimator);
                let mut channel_state = self.channel_state.lock().unwrap();
-               match channel_state.by_id.insert(channel.channel_id(), channel) {
-                       Some(_) => panic!("RNG is bad???"),
-                       None => {}
+               match channel_state.by_id.entry(channel.channel_id()) {
+                       hash_map::Entry::Occupied(_) => {
+                               if cfg!(feature = "fuzztarget") {
+                                       return Err(APIError::APIMisuseError { err: "Fuzzy bad RNG" });
+                               } else {
+                                       panic!("RNG is bad???");
+                               }
+                       },
+                       hash_map::Entry::Vacant(entry) => { entry.insert(channel); }
                }
 
                let mut events = self.pending_events.lock().unwrap();
@@ -2456,9 +2462,11 @@ mod tests {
        }
        impl Drop for Node {
                fn drop(&mut self) {
-                       // Check that we processed all pending events
-                       assert_eq!(self.node.get_and_clear_pending_events().len(), 0);
-                       assert_eq!(self.chan_monitor.added_monitors.lock().unwrap().len(), 0);
+                       if !::std::thread::panicking() {
+                               // Check that we processed all pending events
+                               assert_eq!(self.node.get_and_clear_pending_events().len(), 0);
+                               assert_eq!(self.chan_monitor.added_monitors.lock().unwrap().len(), 0);
+                       }
                }
        }
 
index f3c5c89f6e67cbc1c0e175b75439729385212d33..4b72a3cb69d1c3436048d050c649c3ee1fae350b 100644 (file)
@@ -1011,7 +1011,9 @@ impl ChannelMonitor {
 
        /// Attempst to claim a remote HTLC-Success/HTLC-Timeout s outputs using the revocation key
        fn check_spend_remote_htlc(&self, tx: &Transaction, commitment_number: u64) -> Option<Transaction> {
-               let htlc_txid = tx.txid(); //TODO: This is gonna be a performance bottleneck for watchtowers!
+               if tx.input.len() != 1 || tx.output.len() != 1 {
+                       return None;
+               }
 
                macro_rules! ignore_error {
                        ( $thing : expr ) => {
@@ -1039,6 +1041,7 @@ impl ChannelMonitor {
                };
                let redeemscript = chan_utils::get_revokeable_redeemscript(&revocation_pubkey, self.their_to_self_delay.unwrap(), &delayed_key);
                let revokeable_p2wsh = redeemscript.to_v0_p2wsh();
+               let htlc_txid = tx.txid(); //TODO: This is gonna be a performance bottleneck for watchtowers!
 
                let mut inputs = Vec::new();
                let mut amount = 0;