Browse Source

Fix incorrect locking of mempool during RBF replacement

Previously RemoveStaged() was called without pool.cs held.
tags/v0.15.1
Peter Todd 5 years ago
parent
commit
16a2f93629
No account linked to committer's email address
1 changed files with 5 additions and 2 deletions
  1. 5
    2
      src/main.cpp

+ 5
- 2
src/main.cpp View File

@@ -1006,10 +1006,13 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
size_t nConflictingSize = 0;
uint64_t nConflictingCount = 0;
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())
{
LOCK(pool.cs);

CFeeRate newFeeRate(nFees, nSize);
set<uint256> setConflictsParents;
const int maxDescendantsToVisit = 100;

Loading…
Cancel
Save