mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-02 23:42:33 +02:00
Disable CWalletTx copy constructor
Disable copying of CWalletTx objects to prevent bugs where instances get copied in and out of the mapWallet map and fields are updated in the wrong copy.
This commit is contained in:
parent
65b9d8f8dd
commit
d002f9d15d
@ -1582,7 +1582,7 @@ static UniValue listsinceblock(const JSONRPCRequest& request)
|
|||||||
UniValue transactions(UniValue::VARR);
|
UniValue transactions(UniValue::VARR);
|
||||||
|
|
||||||
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
||||||
CWalletTx tx = pairWtx.second;
|
const CWalletTx& tx = pairWtx.second;
|
||||||
|
|
||||||
if (depth == -1 || abs(tx.GetDepthInMainChain()) < depth) {
|
if (depth == -1 || abs(tx.GetDepthInMainChain()) < depth) {
|
||||||
ListTransactions(pwallet, tx, 0, true, transactions, filter, nullptr /* filter_label */);
|
ListTransactions(pwallet, tx, 0, true, transactions, filter, nullptr /* filter_label */);
|
||||||
|
@ -22,14 +22,12 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
|
|||||||
CDataStream s_prev_tx1(ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"), SER_NETWORK, PROTOCOL_VERSION);
|
CDataStream s_prev_tx1(ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"), SER_NETWORK, PROTOCOL_VERSION);
|
||||||
CTransactionRef prev_tx1;
|
CTransactionRef prev_tx1;
|
||||||
s_prev_tx1 >> prev_tx1;
|
s_prev_tx1 >> prev_tx1;
|
||||||
CWalletTx prev_wtx1(&m_wallet, prev_tx1);
|
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx1->GetHash()), std::forward_as_tuple(&m_wallet, prev_tx1));
|
||||||
m_wallet.mapWallet.emplace(prev_wtx1.GetHash(), std::move(prev_wtx1));
|
|
||||||
|
|
||||||
CDataStream s_prev_tx2(ParseHex("0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"), SER_NETWORK, PROTOCOL_VERSION);
|
CDataStream s_prev_tx2(ParseHex("0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000"), SER_NETWORK, PROTOCOL_VERSION);
|
||||||
CTransactionRef prev_tx2;
|
CTransactionRef prev_tx2;
|
||||||
s_prev_tx2 >> prev_tx2;
|
s_prev_tx2 >> prev_tx2;
|
||||||
CWalletTx prev_wtx2(&m_wallet, prev_tx2);
|
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx2->GetHash()), std::forward_as_tuple(&m_wallet, prev_tx2));
|
||||||
m_wallet.mapWallet.emplace(prev_wtx2.GetHash(), std::move(prev_wtx2));
|
|
||||||
|
|
||||||
// Add scripts
|
// Add scripts
|
||||||
CScript rs1;
|
CScript rs1;
|
||||||
|
@ -3096,7 +3096,7 @@ DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256
|
|||||||
return DBErrors::LOAD_OK;
|
return DBErrors::LOAD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBErrors CWallet::ZapWalletTx(std::vector<CWalletTx>& vWtx)
|
DBErrors CWallet::ZapWalletTx(std::list<CWalletTx>& vWtx)
|
||||||
{
|
{
|
||||||
DBErrors nZapWalletTxRet = WalletBatch(*database,"cr+").ZapWalletTx(vWtx);
|
DBErrors nZapWalletTxRet = WalletBatch(*database,"cr+").ZapWalletTx(vWtx);
|
||||||
if (nZapWalletTxRet == DBErrors::NEED_REWRITE)
|
if (nZapWalletTxRet == DBErrors::NEED_REWRITE)
|
||||||
@ -3708,7 +3708,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
|||||||
const std::string walletFile = WalletDataFilePath(location.GetPath()).string();
|
const std::string walletFile = WalletDataFilePath(location.GetPath()).string();
|
||||||
|
|
||||||
// needed to restore wallet transaction meta data after -zapwallettxes
|
// needed to restore wallet transaction meta data after -zapwallettxes
|
||||||
std::vector<CWalletTx> vWtx;
|
std::list<CWalletTx> vWtx;
|
||||||
|
|
||||||
if (gArgs.GetBoolArg("-zapwallettxes", false)) {
|
if (gArgs.GetBoolArg("-zapwallettxes", false)) {
|
||||||
chain.initMessage(_("Zapping all transactions from wallet...").translated);
|
chain.initMessage(_("Zapping all transactions from wallet...").translated);
|
||||||
|
@ -553,6 +553,12 @@ public:
|
|||||||
const uint256& GetHash() const { return tx->GetHash(); }
|
const uint256& GetHash() const { return tx->GetHash(); }
|
||||||
bool IsCoinBase() const { return tx->IsCoinBase(); }
|
bool IsCoinBase() const { return tx->IsCoinBase(); }
|
||||||
bool IsImmatureCoinBase() const;
|
bool IsImmatureCoinBase() const;
|
||||||
|
|
||||||
|
// Disable copying of CWalletTx objects to prevent bugs where instances get
|
||||||
|
// copied in and out of the mapWallet map, and fields are updated in the
|
||||||
|
// wrong copy.
|
||||||
|
CWalletTx(CWalletTx const &) = delete;
|
||||||
|
void operator=(CWalletTx const &x) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
class COutput
|
class COutput
|
||||||
@ -1057,7 +1063,7 @@ public:
|
|||||||
void chainStateFlushed(const CBlockLocator& loc) override;
|
void chainStateFlushed(const CBlockLocator& loc) override;
|
||||||
|
|
||||||
DBErrors LoadWallet(bool& fFirstRunRet);
|
DBErrors LoadWallet(bool& fFirstRunRet);
|
||||||
DBErrors ZapWalletTx(std::vector<CWalletTx>& vWtx);
|
DBErrors ZapWalletTx(std::list<CWalletTx>& vWtx);
|
||||||
DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
bool SetAddressBook(const CTxDestination& address, const std::string& strName, const std::string& purpose);
|
bool SetAddressBook(const CTxDestination& address, const std::string& strName, const std::string& purpose);
|
||||||
|
@ -738,7 +738,7 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBErrors WalletBatch::FindWalletTx(std::vector<uint256>& vTxHash, std::vector<CWalletTx>& vWtx)
|
DBErrors WalletBatch::FindWalletTx(std::vector<uint256>& vTxHash, std::list<CWalletTx>& vWtx)
|
||||||
{
|
{
|
||||||
DBErrors result = DBErrors::LOAD_OK;
|
DBErrors result = DBErrors::LOAD_OK;
|
||||||
|
|
||||||
@ -776,12 +776,9 @@ DBErrors WalletBatch::FindWalletTx(std::vector<uint256>& vTxHash, std::vector<CW
|
|||||||
if (strType == DBKeys::TX) {
|
if (strType == DBKeys::TX) {
|
||||||
uint256 hash;
|
uint256 hash;
|
||||||
ssKey >> hash;
|
ssKey >> hash;
|
||||||
|
|
||||||
CWalletTx wtx(nullptr /* pwallet */, MakeTransactionRef());
|
|
||||||
ssValue >> wtx;
|
|
||||||
|
|
||||||
vTxHash.push_back(hash);
|
vTxHash.push_back(hash);
|
||||||
vWtx.push_back(wtx);
|
vWtx.emplace_back(nullptr /* wallet */, nullptr /* tx */);
|
||||||
|
ssValue >> vWtx.back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pcursor->close();
|
pcursor->close();
|
||||||
@ -800,7 +797,7 @@ DBErrors WalletBatch::ZapSelectTx(std::vector<uint256>& vTxHashIn, std::vector<u
|
|||||||
{
|
{
|
||||||
// build list of wallet TXs and hashes
|
// build list of wallet TXs and hashes
|
||||||
std::vector<uint256> vTxHash;
|
std::vector<uint256> vTxHash;
|
||||||
std::vector<CWalletTx> vWtx;
|
std::list<CWalletTx> vWtx;
|
||||||
DBErrors err = FindWalletTx(vTxHash, vWtx);
|
DBErrors err = FindWalletTx(vTxHash, vWtx);
|
||||||
if (err != DBErrors::LOAD_OK) {
|
if (err != DBErrors::LOAD_OK) {
|
||||||
return err;
|
return err;
|
||||||
@ -834,7 +831,7 @@ DBErrors WalletBatch::ZapSelectTx(std::vector<uint256>& vTxHashIn, std::vector<u
|
|||||||
return DBErrors::LOAD_OK;
|
return DBErrors::LOAD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBErrors WalletBatch::ZapWalletTx(std::vector<CWalletTx>& vWtx)
|
DBErrors WalletBatch::ZapWalletTx(std::list<CWalletTx>& vWtx)
|
||||||
{
|
{
|
||||||
// build list of wallet TXs
|
// build list of wallet TXs
|
||||||
std::vector<uint256> vTxHash;
|
std::vector<uint256> vTxHash;
|
||||||
|
@ -260,8 +260,8 @@ public:
|
|||||||
bool WriteActiveScriptPubKeyMan(uint8_t type, const uint256& id, bool internal);
|
bool WriteActiveScriptPubKeyMan(uint8_t type, const uint256& id, bool internal);
|
||||||
|
|
||||||
DBErrors LoadWallet(CWallet* pwallet);
|
DBErrors LoadWallet(CWallet* pwallet);
|
||||||
DBErrors FindWalletTx(std::vector<uint256>& vTxHash, std::vector<CWalletTx>& vWtx);
|
DBErrors FindWalletTx(std::vector<uint256>& vTxHash, std::list<CWalletTx>& vWtx);
|
||||||
DBErrors ZapWalletTx(std::vector<CWalletTx>& vWtx);
|
DBErrors ZapWalletTx(std::list<CWalletTx>& vWtx);
|
||||||
DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
|
DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
|
||||||
/* Try to (very carefully!) recover wallet database (with a possible key type filter) */
|
/* Try to (very carefully!) recover wallet database (with a possible key type filter) */
|
||||||
static bool Recover(const fs::path& wallet_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& out_backup_filename);
|
static bool Recover(const fs::path& wallet_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& out_backup_filename);
|
||||||
|
Loading…
Reference in New Issue
Block a user