From 9d3f7eb9860254eb787ebe2734fd6a26bcf365c1 Mon Sep 17 00:00:00 2001 From: gzhao408 Date: Fri, 1 May 2020 15:48:23 -0700 Subject: [PATCH] [mempool] sanity check that all unbroadcast txns are in mempool - before reattempting broadcast for unbroadcast txns, check they are in mempool and remove if not - this protects from memory leaks and network spam just in case unbroadcast set (incorrectly) has extra txns - check that tx is in mempool before adding to unbroadcast set to try to prevent this from happening --- src/net_processing.cpp | 7 ++++++- src/txmempool.h | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 7e9bb2f27c..817ec1d79b 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -819,7 +819,12 @@ void PeerLogicValidation::ReattemptInitialBroadcast(CScheduler& scheduler) const std::set unbroadcast_txids = m_mempool.GetUnbroadcastTxs(); for (const uint256& txid : unbroadcast_txids) { - RelayTransaction(txid, *connman); + // Sanity check: all unbroadcast txns should exist in the mempool + if (m_mempool.exists(txid)) { + RelayTransaction(txid, *connman); + } else { + m_mempool.RemoveUnbroadcastTx(txid, true); + } } // schedule next run for 10-15 minutes in the future diff --git a/src/txmempool.h b/src/txmempool.h index 0f3ae3630c..4568eb928d 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -704,7 +704,10 @@ public: /** Adds a transaction to the unbroadcast set */ void AddUnbroadcastTx(const uint256& txid) { LOCK(cs); - m_unbroadcast_txids.insert(txid); + /** Sanity Check: the transaction should also be in the mempool */ + if (exists(txid)) { + m_unbroadcast_txids.insert(txid); + } } /** Removes a transaction from the unbroadcast set */