Skip to content

Commit 241b0cb

Browse files
authored
Merge pull request #246 from TheBlueMatt/2018-11-fuzz-crash-redux
Several fuzz-found bugfixes.
2 parents 93c8760 + 3a066cc commit 241b0cb

File tree

4 files changed

+25
-16
lines changed

4 files changed

+25
-16
lines changed

fuzz/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ cc = "1.0"
3131
[workspace]
3232
members = ["."]
3333

34+
[profile.release]
35+
lto = true
36+
codegen-units = 1
37+
3438
[[bin]]
3539
name = "peer_crypt_target"
3640
path = "fuzz_targets/peer_crypt_target.rs"

src/ln/channelmanager.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1988,10 +1988,20 @@ impl ChannelManager {
19881988
// but if we've sent a shutdown and they haven't acknowledged it yet, we just
19891989
// want to reject the new HTLC and fail it backwards instead of forwarding.
19901990
if let PendingHTLCStatus::Forward(PendingForwardHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
1991+
let chan_update = self.get_channel_update(chan);
19911992
pending_forward_info = PendingHTLCStatus::Fail(HTLCFailureMsg::Relay(msgs::UpdateFailHTLC {
19921993
channel_id: msg.channel_id,
19931994
htlc_id: msg.htlc_id,
1994-
reason: ChannelManager::build_first_hop_failure_packet(&incoming_shared_secret, 0x1000|20, &self.get_channel_update(chan).unwrap().encode_with_len()[..]),
1995+
reason: if let Ok(update) = chan_update {
1996+
ChannelManager::build_first_hop_failure_packet(&incoming_shared_secret, 0x1000|20, &update.encode_with_len()[..])
1997+
} else {
1998+
// This can only happen if the channel isn't in the fully-funded
1999+
// state yet, implying our counterparty is trying to route payments
2000+
// over the channel back to themselves (cause no one else should
2001+
// know the short_id is a lightning channel yet). We should have no
2002+
// problem just calling this unknown_next_peer
2003+
ChannelManager::build_first_hop_failure_packet(&incoming_shared_secret, 0x4000|10, &[])
2004+
},
19952005
}));
19962006
}
19972007
}

src/ln/peer_channel_encryptor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ impl PeerChannelEncryptor {
279279
self.process_act_one_with_ephemeral_key(act_one, our_node_secret, our_ephemeral_key)
280280
}
281281

282-
pub fn process_act_two(&mut self, act_two: &[u8], our_node_secret: &SecretKey) -> Result<[u8; 66], HandleError> {
282+
pub fn process_act_two(&mut self, act_two: &[u8], our_node_secret: &SecretKey) -> Result<([u8; 66], PublicKey), HandleError> {
283283
assert_eq!(act_two.len(), 50);
284284

285285
let mut final_hkdf = [0; 64];
@@ -334,7 +334,7 @@ impl PeerChannelEncryptor {
334334
rck: ck,
335335
};
336336

337-
Ok(res)
337+
Ok((res, self.their_node_id.unwrap().clone()))
338338
}
339339

340340
pub fn process_act_three(&mut self, act_three: &[u8]) -> Result<PublicKey, HandleError> {
@@ -537,7 +537,7 @@ mod tests {
537537
let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
538538

539539
let act_two = hex::decode("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
540-
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
540+
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap().0[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
541541

542542
match outbound_peer.noise_state {
543543
NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
@@ -694,7 +694,7 @@ mod tests {
694694
let our_node_id = SecretKey::from_slice(&secp_ctx, &hex::decode("1111111111111111111111111111111111111111111111111111111111111111").unwrap()[..]).unwrap();
695695

696696
let act_two = hex::decode("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
697-
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
697+
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap().0[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
698698

699699
match outbound_peer.noise_state {
700700
NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {

src/ln/peer_handler.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
234234
if peers.peers.insert(descriptor, Peer {
235235
channel_encryptor: peer_encryptor,
236236
outbound: true,
237-
their_node_id: Some(their_node_id),
237+
their_node_id: None,
238238
their_global_features: None,
239239
their_local_features: None,
240240

@@ -438,9 +438,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
438438

439439
macro_rules! try_potential_handleerror {
440440
($thing: expr) => {
441-
try_potential_handleerror!($thing, false);
442-
};
443-
($thing: expr, $pre_noise: expr) => {
444441
match $thing {
445442
Ok(x) => x,
446443
Err(e) => {
@@ -449,9 +446,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
449446
msgs::ErrorAction::DisconnectPeer { msg: _ } => {
450447
//TODO: Try to push msg
451448
log_trace!(self, "Got Err handling message, disconnecting peer because {}", e.err);
452-
if $pre_noise {
453-
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
454-
}
455449
return Err(PeerHandleError{ no_connection_possible: false });
456450
},
457451
msgs::ErrorAction::IgnoreError => {
@@ -517,16 +511,17 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
517511
let next_step = peer.channel_encryptor.get_noise_step();
518512
match next_step {
519513
NextNoiseStep::ActOne => {
520-
let act_two = try_potential_handleerror!(peer.channel_encryptor.process_act_one_with_key(&peer.pending_read_buffer[..], &self.our_node_secret), true).to_vec();
514+
let act_two = try_potential_handleerror!(peer.channel_encryptor.process_act_one_with_key(&peer.pending_read_buffer[..], &self.our_node_secret)).to_vec();
521515
peer.pending_outbound_buffer.push_back(act_two);
522516
peer.pending_read_buffer = [0; 66].to_vec(); // act three is 66 bytes long
523517
},
524518
NextNoiseStep::ActTwo => {
525-
let act_three = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret), true).to_vec();
526-
peer.pending_outbound_buffer.push_back(act_three);
519+
let (act_three, their_node_id) = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret));
520+
peer.pending_outbound_buffer.push_back(act_three.to_vec());
527521
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
528522
peer.pending_read_is_header = true;
529523

524+
peer.their_node_id = Some(their_node_id);
530525
insert_node_id!();
531526
let mut local_features = msgs::LocalFeatures::new();
532527
if self.initial_syncs_sent.load(Ordering::Acquire) < INITIAL_SYNCS_TO_SEND {
@@ -539,7 +534,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
539534
}, 16);
540535
},
541536
NextNoiseStep::ActThree => {
542-
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]), true);
537+
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]));
543538
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
544539
peer.pending_read_is_header = true;
545540
peer.their_node_id = Some(their_node_id);

0 commit comments

Comments
 (0)