Skip to content

Commit 0cb6d2a

Browse files
committed
Bugfix: Wallet: Document expectations for AddWalletFlags (now InitWalletFlags) correctly
1 parent 30308cc commit 0cb6d2a

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

src/wallet/wallet.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,16 +1479,20 @@ bool CWallet::LoadWalletFlags(uint64_t flags)
14791479
return true;
14801480
}
14811481

1482-
bool CWallet::AddWalletFlags(uint64_t flags)
1482+
void CWallet::InitWalletFlags(uint64_t flags)
14831483
{
14841484
LOCK(cs_wallet);
1485+
14851486
// We should never be writing unknown non-tolerable wallet flags
14861487
assert(((flags & KNOWN_WALLET_FLAGS) >> 32) == (flags >> 32));
1488+
// This should only be used once, when creating a new wallet - so current flags are expected to be blank
1489+
assert(m_wallet_flags == 0);
1490+
14871491
if (!WalletBatch(GetDatabase()).WriteWalletFlags(flags)) {
14881492
throw std::runtime_error(std::string(__func__) + ": writing wallet flags failed");
14891493
}
14901494

1491-
return LoadWalletFlags(flags);
1495+
if (!LoadWalletFlags(flags)) assert(false);
14921496
}
14931497

14941498
// Helper for producing a max-sized low-S low-R signature (eg 71 bytes)
@@ -2721,7 +2725,7 @@ std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::stri
27212725
// ensure this wallet.dat can only be opened by clients supporting HD with chain split and expects no default key
27222726
walletInstance->SetMinVersion(FEATURE_LATEST);
27232727

2724-
walletInstance->AddWalletFlags(wallet_creation_flags);
2728+
walletInstance->InitWalletFlags(wallet_creation_flags);
27252729

27262730
// Only create LegacyScriptPubKeyMan when not descriptor wallet
27272731
if (!walletInstance->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {

src/wallet/wallet.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,8 +781,9 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati
781781
bool IsWalletFlagSet(uint64_t flag) const override;
782782

783783
/** overwrite all flags by the given uint64_t
784-
returns false if unknown, non-tolerable flags are present */
785-
bool AddWalletFlags(uint64_t flags);
784+
flags must be uninitialised (or 0)
785+
only known flags may be present */
786+
void InitWalletFlags(uint64_t flags);
786787
/** Loads the flags into the wallet. (used by LoadWallet) */
787788
bool LoadWalletFlags(uint64_t flags);
788789

src/wallet/wallettool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static void WalletCreate(CWallet* wallet_instance, uint64_t wallet_creation_flag
3434
LOCK(wallet_instance->cs_wallet);
3535

3636
wallet_instance->SetMinVersion(FEATURE_LATEST);
37-
wallet_instance->AddWalletFlags(wallet_creation_flags);
37+
wallet_instance->InitWalletFlags(wallet_creation_flags);
3838

3939
if (!wallet_instance->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
4040
auto spk_man = wallet_instance->GetOrCreateLegacyScriptPubKeyMan();

0 commit comments

Comments
 (0)