From 97875315f884ed8ba9d4481cb6e7dd561f171fbc Mon Sep 17 00:00:00 2001 From: Guilherme Lawless Date: Wed, 4 Mar 2020 13:55:47 +0000 Subject: [PATCH] Re-lock after activating dependencies (bug found by @cryptocode) Otherwise, could call state_change to `expired_unconfirmed` without owning the mutex --- nano/node/election.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nano/node/election.cpp b/nano/node/election.cpp index c0d88b3e64..4997d7413d 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -280,6 +280,7 @@ bool nano::election::transition_time (nano::confirmation_solicitor & solicitor_a state_change (nano::election::state_t::active, nano::election::state_t::backtracking); lock.unlock (); activate_dependencies (); + lock.lock (); } break; case nano::election::state_t::backtracking: @@ -298,7 +299,6 @@ bool nano::election::transition_time (nano::confirmation_solicitor & solicitor_a debug_assert (false); break; } - // Note: lock (timepoints_mutex) is at an unknown state here - possibly unlocked before activate_dependencies if (!confirmed () && std::chrono::minutes (5) < std::chrono::steady_clock::now () - election_start) { result = true;