From 7ff45ea2a5e0cb9bacd2eaa8673146df53f3309a Mon Sep 17 00:00:00 2001 From: draoi Date: Tue, 2 Apr 2024 13:44:45 +0200 Subject: [PATCH] refinery: acquire exclusive lock on greylist before refining Modifications to the greylist (appending or deleting from) are dangerous while the refinery is ongoing, since it can lead to panics in the case the refinery fails (because we delete from the greylist by index when that happens). We mitigate this issue by acquiring an exclusive lock on the greylist before proceeding with the refinery, and dropping the lock once the refinery process has finished and greylist modifications are no longer dangerous. --- src/net/session/refine_session.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/net/session/refine_session.rs b/src/net/session/refine_session.rs index 5093c9d3b..ff8509e7c 100644 --- a/src/net/session/refine_session.rs +++ b/src/net/session/refine_session.rs @@ -250,9 +250,8 @@ impl GreylistRefinery { } // Freeze the greylist in this state. Necessary since the greylist - // can be modified by `hosts::move_host()`. - let mut greylist = - hosts.container.hostlists[HostColor::Grey as usize].write().await; + // can be modified by `hosts::move_host()` or `hosts::store()`. + let mut greylist = hosts.container.hostlists[HostColor::Grey as usize].write().await; if !self.session().handshake_node(url.clone(), self.p2p().clone()).await { greylist.remove(position);