From fa67466d2068cd7bcabc4b765a8201a24d36af73 Mon Sep 17 00:00:00 2001 From: sowle Date: Fri, 5 Apr 2024 14:09:27 +0200 Subject: [PATCH] wallet2: fix an issue in prepare_tx_sources() where some transfers may be locked if there's was exception during preparing phase --- src/wallet/wallet2.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index c1ddca9b..2d3a5ceb 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -6234,10 +6234,18 @@ bool wallet2::prepare_tx_sources_for_defragmentation_tx(std::vector& sources, std::vector& selected_indicies) { - bool r = select_transfers(needed_money_map, fake_outputs_count, dust_threshold, selected_indicies); - if (!r) - return r; - return prepare_tx_sources(fake_outputs_count, sources, selected_indicies); + try + { + select_transfers(needed_money_map, fake_outputs_count, dust_threshold, selected_indicies); // always returns true, TODO consider refactoring -- sowle + return prepare_tx_sources(fake_outputs_count, sources, selected_indicies); + } + catch(...) + { + // if smth went wrong -- invalidate transfers cache to trigger its regeneration on the next use + // it is necessary because it may be in invalid state (some items might be erased within select_indices_for_transfer() or expand_selection_with_zc_input()) + m_found_free_amounts.clear(); + throw; + } } //---------------------------------------------------------------------------------------------------- void wallet2::prefetch_global_indicies_if_needed(const std::vector& selected_indicies)