Merge #8606: Fix some locks

144ed76 Fix some locks (Pieter Wuille)
This commit is contained in:
Pieter Wuille 2016-09-07 13:08:01 +02:00 committed by Alexander Block
parent 2189570911
commit f7e9bc613a

View File

@ -899,10 +899,16 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
connman.PushMessage(pfrom, NetMsgType::BLOCK, block); connman.PushMessage(pfrom, NetMsgType::BLOCK, block);
else // MSG_FILTERED_BLOCK) else // MSG_FILTERED_BLOCK)
{ {
LOCK(pfrom->cs_filter); bool send = false;
if (pfrom->pfilter) CMerkleBlock merkleBlock;
{ {
CMerkleBlock merkleBlock(block, *pfrom->pfilter); LOCK(pfrom->cs_filter);
if (pfrom->pfilter) {
send = true;
merkleBlock = CMerkleBlock(block, *pfrom->pfilter);
}
}
if (send) {
connman.PushMessage(pfrom, NetMsgType::MERKLEBLOCK, merkleBlock); connman.PushMessage(pfrom, NetMsgType::MERKLEBLOCK, merkleBlock);
// CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see // CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see
// This avoids hurting performance by pointlessly requiring a round-trip // This avoids hurting performance by pointlessly requiring a round-trip
@ -2144,8 +2150,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
CBloomFilter filter; CBloomFilter filter;
vRecv >> filter; vRecv >> filter;
LOCK(pfrom->cs_filter);
if (!filter.IsWithinSizeConstraints()) if (!filter.IsWithinSizeConstraints())
{ {
// There is no excuse for sending a too-large filter // There is no excuse for sending a too-large filter
@ -2154,11 +2158,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
} }
else else
{ {
LOCK(pfrom->cs_filter);
delete pfrom->pfilter; delete pfrom->pfilter;
pfrom->pfilter = new CBloomFilter(filter); pfrom->pfilter = new CBloomFilter(filter);
pfrom->pfilter->UpdateEmptyFull(); pfrom->pfilter->UpdateEmptyFull();
pfrom->fRelayTxes = true;
} }
pfrom->fRelayTxes = true;
} }
@ -2169,20 +2174,21 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Nodes must NEVER send a data item > 520 bytes (the max size for a script data object, // Nodes must NEVER send a data item > 520 bytes (the max size for a script data object,
// and thus, the maximum size any matched object can have) in a filteradd message // and thus, the maximum size any matched object can have) in a filteradd message
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) bool bad = false;
{ if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) {
LOCK(cs_main); bad = true;
Misbehaving(pfrom->GetId(), 100);
} else { } else {
LOCK(pfrom->cs_filter); LOCK(pfrom->cs_filter);
if (pfrom->pfilter) if (pfrom->pfilter) {
pfrom->pfilter->insert(vData); pfrom->pfilter->insert(vData);
else } else {
{ bad = true;
LOCK(cs_main);
Misbehaving(pfrom->GetId(), 100);
} }
} }
if (bad) {
LOCK(cs_main);
Misbehaving(pfrom->GetId(), 100);
}
} }