Skip to content

Commit 6ccd07b

Browse files
committed
Make lockorder consistent in channelmanager
This resolves a lockorder inversion in `ChannelManager::finalize_claims` where `pending_outbound_payments` is locked after `pending_events`, opposite of, for example, the lockorder in `ChannelManager::fail_htlc_backwards_internal` where `pending_outbound_payments` is locked at the top of the `HTLCSource::OutboundRoute` handling and then `pending_events` is locked at the end.
1 parent a82067d commit 6ccd07b

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3931,12 +3931,12 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39313931
}
39323932

39333933
fn finalize_claims(&self, mut sources: Vec<HTLCSource>) {
3934+
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
39343935
let mut pending_events = self.pending_events.lock().unwrap();
39353936
for source in sources.drain(..) {
39363937
if let HTLCSource::OutboundRoute { session_priv, payment_id, path, .. } = source {
39373938
let mut session_priv_bytes = [0; 32];
39383939
session_priv_bytes.copy_from_slice(&session_priv[..]);
3939-
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
39403940
if let hash_map::Entry::Occupied(mut payment) = outbounds.entry(payment_id) {
39413941
assert!(payment.get().is_fulfilled());
39423942
if payment.get_mut().remove(&session_priv_bytes, None) {
@@ -5321,8 +5321,8 @@ where
53215321
inbound_payment.expiry_time > header.time as u64
53225322
});
53235323

5324-
let mut pending_events = self.pending_events.lock().unwrap();
53255324
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
5325+
let mut pending_events = self.pending_events.lock().unwrap();
53265326
outbounds.retain(|payment_id, payment| {
53275327
if payment.remaining_parts() != 0 { return true }
53285328
if let PendingOutboundPayment::Retryable { starting_block_height, payment_hash, .. } = payment {
@@ -6151,6 +6151,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
61516151
peer_state.latest_features.write(writer)?;
61526152
}
61536153

6154+
let pending_inbound_payments = self.pending_inbound_payments.lock().unwrap();
6155+
let pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
61546156
let events = self.pending_events.lock().unwrap();
61556157
(events.len() as u64).write(writer)?;
61566158
for event in events.iter() {
@@ -6172,14 +6174,12 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
61726174
(self.last_node_announcement_serial.load(Ordering::Acquire) as u32).write(writer)?;
61736175
(self.highest_seen_timestamp.load(Ordering::Acquire) as u32).write(writer)?;
61746176

6175-
let pending_inbound_payments = self.pending_inbound_payments.lock().unwrap();
61766177
(pending_inbound_payments.len() as u64).write(writer)?;
61776178
for (hash, pending_payment) in pending_inbound_payments.iter() {
61786179
hash.write(writer)?;
61796180
pending_payment.write(writer)?;
61806181
}
61816182

6182-
let pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
61836183
// For backwards compat, write the session privs and their total length.
61846184
let mut num_pending_outbounds_compat: u64 = 0;
61856185
for (_, outbound) in pending_outbound_payments.iter() {

0 commit comments

Comments
 (0)