Skip to content

Commit c1874c6

Browse files
committed
net_processing: gate m_tx_relay access behind !IsBlockOnlyConn()
In bitcoin#21528, the value of `m_addr_relay_enabled` isn't determined until the first ADDR/ADDRV2/GETADDR call. Until then, it'll always default to `false`. This creates a false-negative where a term equivalent to "not a block connection" no longer reliably means that. Therefore we need to switch to directly querying "not a block-only connection".
1 parent 602d13d commit c1874c6

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/net_processing.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2230,7 +2230,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
22302230
} else if (inv.IsMsgFilteredBlk()) {
22312231
bool sendMerkleBlock = false;
22322232
CMerkleBlock merkleBlock;
2233-
if (RelayAddrsWithPeer(peer)) {
2233+
if (!pfrom.IsBlockOnlyConn()) {
22342234
LOCK(pfrom.m_tx_relay->cs_filter);
22352235
if (pfrom.m_tx_relay->pfilter) {
22362236
sendMerkleBlock = true;
@@ -2333,7 +2333,7 @@ void PeerManagerImpl::ProcessGetData(CNode& pfrom, Peer& peer, const std::atomic
23332333

23342334
const std::chrono::seconds now = GetTime<std::chrono::seconds>();
23352335
// Get last mempool request time
2336-
const std::chrono::seconds mempool_req = RelayAddrsWithPeer(peer) ? pfrom.m_tx_relay->m_last_mempool_req.load()
2336+
const std::chrono::seconds mempool_req = !pfrom.IsBlockOnlyConn() ? pfrom.m_tx_relay->m_last_mempool_req.load()
23372337
: std::chrono::seconds::min();
23382338

23392339
// Process as many TX items from the front of the getdata queue as
@@ -3197,7 +3197,7 @@ void PeerManagerImpl::ProcessMessage(
31973197
// set nodes not capable of serving the complete blockchain history as "limited nodes"
31983198
pfrom.m_limited_node = (!(nServices & NODE_NETWORK) && (nServices & NODE_NETWORK_LIMITED));
31993199

3200-
if (RelayAddrsWithPeer(*peer)) {
3200+
if (!pfrom.IsBlockOnlyConn()) {
32013201
LOCK(pfrom.m_tx_relay->cs_filter);
32023202
pfrom.m_tx_relay->fRelayTxes = fRelay; // set to true after we get the first filter* message
32033203
}
@@ -4414,7 +4414,7 @@ void PeerManagerImpl::ProcessMessage(
44144414
return;
44154415
}
44164416

4417-
if (RelayAddrsWithPeer(*peer)) {
4417+
if (!pfrom.IsBlockOnlyConn()) {
44184418
LOCK(pfrom.m_tx_relay->cs_tx_inventory);
44194419
pfrom.m_tx_relay->fSendMempool = true;
44204420
}
@@ -4508,7 +4508,7 @@ void PeerManagerImpl::ProcessMessage(
45084508
// There is no excuse for sending a too-large filter
45094509
Misbehaving(pfrom.GetId(), 100, "too-large bloom filter");
45104510
}
4511-
else if (RelayAddrsWithPeer(*peer))
4511+
else if (!pfrom.IsBlockOnlyConn())
45124512
{
45134513
LOCK(pfrom.m_tx_relay->cs_filter);
45144514
pfrom.m_tx_relay->pfilter.reset(new CBloomFilter(filter));
@@ -4531,7 +4531,7 @@ void PeerManagerImpl::ProcessMessage(
45314531
bool bad = false;
45324532
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) {
45334533
bad = true;
4534-
} else if (RelayAddrsWithPeer(*peer)) {
4534+
} else if (!pfrom.IsBlockOnlyConn()) {
45354535
LOCK(pfrom.m_tx_relay->cs_filter);
45364536
if (pfrom.m_tx_relay->pfilter) {
45374537
pfrom.m_tx_relay->pfilter->insert(vData);
@@ -4551,7 +4551,7 @@ void PeerManagerImpl::ProcessMessage(
45514551
pfrom.fDisconnect = true;
45524552
return;
45534553
}
4554-
if (!RelayAddrsWithPeer(*peer)) {
4554+
if (pfrom.IsBlockOnlyConn()) {
45554555
return;
45564556
}
45574557
LOCK(pfrom.m_tx_relay->cs_filter);
@@ -5336,7 +5336,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
53365336
LOCK2(m_mempool.cs, peer->m_block_inv_mutex);
53375337

53385338
size_t reserve = INVENTORY_BROADCAST_MAX_PER_1MB_BLOCK * MaxBlockSize() / 1000000;
5339-
if (RelayAddrsWithPeer(*peer)) {
5339+
if (!pto->IsBlockOnlyConn()) {
53405340
LOCK(pto->m_tx_relay->cs_tx_inventory);
53415341
reserve = std::min<size_t>(pto->m_tx_relay->setInventoryTxToSend.size(), reserve);
53425342
}
@@ -5367,7 +5367,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
53675367
}
53685368
};
53695369

5370-
if (RelayAddrsWithPeer(*peer)) {
5370+
if (!pto->IsBlockOnlyConn()) {
53715371
LOCK(pto->m_tx_relay->cs_tx_inventory);
53725372
// Check whether periodic sends should happen
53735373
// Note: If this node is running in a Masternode mode, it makes no sense to delay outgoing txes

0 commit comments

Comments
 (0)