diff options
author | fanquake <fanquake@gmail.com> | 2022-08-17 14:35:53 +0100 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2022-08-17 14:39:50 +0100 |
commit | 0ae0aa251b9c0401e4318756ca8b7a41193fac7e (patch) | |
tree | 0bda80e97c19d2d7753b81a1022598896adb479c | |
parent | 95d4744f024f40ebf61b38a51083629830b6141b (diff) | |
parent | f59959e3818692c5b3c2dfa51c14e515085e940f (diff) | |
download | bitcoin-0ae0aa251b9c0401e4318756ca8b7a41193fac7e.tar.xz |
Merge bitcoin/bitcoin#24678: Prevent wallet unload on GetWalletForJSONRPCRequest
f59959e3818692c5b3c2dfa51c14e515085e940f wallet: Prevent wallet unload on GetWalletForJSONRPCRequest (João Barbosa)
Pull request description:
Don't extend shared ownership of all wallets to `GetWalletForJSONRPCRequest` scope.
ACKs for top commit:
achow101:
ACK f59959e3818692c5b3c2dfa51c14e515085e940f
shaavan:
Code Review ACK f59959e3818692c5b3c2dfa51c14e515085e940f
theStack:
Concept and code-review ACK f59959e3818692c5b3c2dfa51c14e515085e940f
Tree-SHA512: 7c0294098b5c32acaab8cc6fcf17a581d580ad1a557ba0602a9506074ac035815739afb4a25b3e61be9132535c7fc3ec7ef5137c1dfc9d4078f13663d508ef55
-rw-r--r-- | src/wallet/rpc/util.cpp | 9 | ||||
-rw-r--r-- | src/wallet/wallet.cpp | 7 | ||||
-rw-r--r-- | src/wallet/wallet.h | 1 |
3 files changed, 12 insertions, 5 deletions
diff --git a/src/wallet/rpc/util.cpp b/src/wallet/rpc/util.cpp index 16305d4465..3c1634324e 100644 --- a/src/wallet/rpc/util.cpp +++ b/src/wallet/rpc/util.cpp @@ -64,12 +64,11 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques return pwallet; } - std::vector<std::shared_ptr<CWallet>> wallets = GetWallets(context); - if (wallets.size() == 1) { - return wallets[0]; - } + size_t count{0}; + auto wallet = GetDefaultWallet(context, count); + if (wallet) return wallet; - if (wallets.empty()) { + if (count == 0) { throw JSONRPCError( RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)"); } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 45f49954a3..d598425326 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -149,6 +149,13 @@ std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context) return context.wallets; } +std::shared_ptr<CWallet> GetDefaultWallet(WalletContext& context, size_t& count) +{ + LOCK(context.wallets_mutex); + count = context.wallets.size(); + return count == 1 ? context.wallets[0] : nullptr; +} + std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name) { LOCK(context.wallets_mutex); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 247c172da3..4fc41b2f53 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -64,6 +64,7 @@ bool AddWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet); bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start, std::vector<bilingual_str>& warnings); bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start); std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context); +std::shared_ptr<CWallet> GetDefaultWallet(WalletContext& context, size_t& count); std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name); std::shared_ptr<CWallet> LoadWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings); std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings); |