lock cs_main for State/Misbehaving
ProcessMessage calls State(...) and Misbehaving(...) without holding the required lock; add LOCK(cs_main) blocks.
This commit is contained in:
parent
46880ed2fd
commit
efb54ba065
1 changed files with 17 additions and 0 deletions
17
src/main.cpp
17
src/main.cpp
|
@ -4514,6 +4514,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
strCommand == NetMsgType::FILTERCLEAR))
|
strCommand == NetMsgType::FILTERCLEAR))
|
||||||
{
|
{
|
||||||
if (pfrom->nVersion >= NO_BLOOM_VERSION) {
|
if (pfrom->nVersion >= NO_BLOOM_VERSION) {
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 100);
|
Misbehaving(pfrom->GetId(), 100);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -4529,6 +4530,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
if (pfrom->nVersion != 0)
|
if (pfrom->nVersion != 0)
|
||||||
{
|
{
|
||||||
pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, string("Duplicate version message"));
|
pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, string("Duplicate version message"));
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 1);
|
Misbehaving(pfrom->GetId(), 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4584,7 +4586,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);
|
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);
|
||||||
|
|
||||||
// Potentially mark this peer as a preferred download peer.
|
// Potentially mark this peer as a preferred download peer.
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
UpdatePreferredDownload(pfrom, State(pfrom->GetId()));
|
UpdatePreferredDownload(pfrom, State(pfrom->GetId()));
|
||||||
|
}
|
||||||
|
|
||||||
// Change version
|
// Change version
|
||||||
pfrom->PushMessage(NetMsgType::VERACK);
|
pfrom->PushMessage(NetMsgType::VERACK);
|
||||||
|
@ -4642,6 +4647,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
else if (pfrom->nVersion == 0)
|
else if (pfrom->nVersion == 0)
|
||||||
{
|
{
|
||||||
// Must have a version message before anything else
|
// Must have a version message before anything else
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 1);
|
Misbehaving(pfrom->GetId(), 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4677,6 +4683,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
return true;
|
return true;
|
||||||
if (vAddr.size() > 1000)
|
if (vAddr.size() > 1000)
|
||||||
{
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 20);
|
Misbehaving(pfrom->GetId(), 20);
|
||||||
return error("message addr size() = %u", vAddr.size());
|
return error("message addr size() = %u", vAddr.size());
|
||||||
}
|
}
|
||||||
|
@ -4746,6 +4753,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
vRecv >> vInv;
|
vRecv >> vInv;
|
||||||
if (vInv.size() > MAX_INV_SZ)
|
if (vInv.size() > MAX_INV_SZ)
|
||||||
{
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 20);
|
Misbehaving(pfrom->GetId(), 20);
|
||||||
return error("message inv size() = %u", vInv.size());
|
return error("message inv size() = %u", vInv.size());
|
||||||
}
|
}
|
||||||
|
@ -4821,6 +4829,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
vRecv >> vInv;
|
vRecv >> vInv;
|
||||||
if (vInv.size() > MAX_INV_SZ)
|
if (vInv.size() > MAX_INV_SZ)
|
||||||
{
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 20);
|
Misbehaving(pfrom->GetId(), 20);
|
||||||
return error("message getdata size() = %u", vInv.size());
|
return error("message getdata size() = %u", vInv.size());
|
||||||
}
|
}
|
||||||
|
@ -5074,6 +5083,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
|
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
|
||||||
unsigned int nCount = ReadCompactSize(vRecv);
|
unsigned int nCount = ReadCompactSize(vRecv);
|
||||||
if (nCount > MAX_HEADERS_RESULTS) {
|
if (nCount > MAX_HEADERS_RESULTS) {
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 20);
|
Misbehaving(pfrom->GetId(), 20);
|
||||||
return error("headers message size = %u", nCount);
|
return error("headers message size = %u", nCount);
|
||||||
}
|
}
|
||||||
|
@ -5350,8 +5360,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
vRecv >> filter;
|
vRecv >> 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
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 100);
|
Misbehaving(pfrom->GetId(), 100);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOCK(pfrom->cs_filter);
|
LOCK(pfrom->cs_filter);
|
||||||
|
@ -5372,15 +5385,19 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
// 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)
|
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
||||||
{
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 100);
|
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
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
Misbehaving(pfrom->GetId(), 100);
|
Misbehaving(pfrom->GetId(), 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
else if (strCommand == NetMsgType::FILTERCLEAR)
|
else if (strCommand == NetMsgType::FILTERCLEAR)
|
||||||
|
|
Loading…
Reference in a new issue