From 18a18d89627f95f42a46ce3e247348c45c8f0717 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sat, 2 Dec 2023 17:54:18 +0000 Subject: [PATCH] Correct lock drop'ing in `ChainMonitor::update_channel` e21a500668179c7084e2df5cb75019810eb03cbe cleaned up the error handling in `ChainMonitor::update_channel` a bit, but accidentally replaced the deliberate panic with a hang. This commit ensures we properly drop the monitors read lock before taking a write lock. --- lightning/src/chain/chainmonitor.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 8c7bafe3..1fe3fcd9 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -753,8 +753,7 @@ where C::Target: chain::Filter, fn update_channel(&self, funding_txo: OutPoint, update: &ChannelMonitorUpdate) -> ChannelMonitorUpdateStatus { // Update the monitor that watches the channel referred to by the given outpoint. - let monitors_lock = self.monitors.read().unwrap(); - let monitors = monitors_lock.deref(); + let monitors = self.monitors.read().unwrap(); match monitors.get(&funding_txo) { None => { log_error!(self.logger, "Failed to update channel monitor: no such monitor registered"); @@ -797,6 +796,7 @@ where C::Target: chain::Filter, ChannelMonitorUpdateStatus::UnrecoverableError => { // Take the monitors lock for writing so that we poison it and any future // operations going forward fail immediately. + core::mem::drop(pending_monitor_updates); core::mem::drop(monitors); let _poison = self.monitors.write().unwrap(); let err_str = "ChannelMonitor[Update] persistence failed unrecoverably. This indicates we cannot continue normal operation and must shut down."; -- 2.30.2