Fix incorrect locking of mempool during RBF replacement
Previously RemoveStaged() was called without pool.cs held.
This commit is contained in:
parent
97203f5606
commit
16a2f93629
@ -1006,10 +1006,13 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
size_t nConflictingSize = 0;
|
size_t nConflictingSize = 0;
|
||||||
uint64_t nConflictingCount = 0;
|
uint64_t nConflictingCount = 0;
|
||||||
CTxMemPool::setEntries allConflicting;
|
CTxMemPool::setEntries allConflicting;
|
||||||
|
|
||||||
|
// If we don't hold the lock allConflicting might be incomplete; the
|
||||||
|
// subsequent RemoveStaged() and addUnchecked() calls don't guarantee
|
||||||
|
// mempool consistency for us.
|
||||||
|
LOCK(pool.cs);
|
||||||
if (setConflicts.size())
|
if (setConflicts.size())
|
||||||
{
|
{
|
||||||
LOCK(pool.cs);
|
|
||||||
|
|
||||||
CFeeRate newFeeRate(nFees, nSize);
|
CFeeRate newFeeRate(nFees, nSize);
|
||||||
set<uint256> setConflictsParents;
|
set<uint256> setConflictsParents;
|
||||||
const int maxDescendantsToVisit = 100;
|
const int maxDescendantsToVisit = 100;
|
||||||
|
Loading…
Reference in New Issue
Block a user