mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 06:28:31 +01:00
Drop release times for CNode
It seems there were two mechanisms for assessing whether a CNode was still in use: a refcount and a release timestamp. The latter seems to have been there for a long time, as a safety mechanism. However, this timer also keeps CNode objects alive for far longer than necessary after disconnects, potentially opening up a DoS window. This commit removes the timestamp-based mechanism, and replaces it with an assert(nRefCount >= 0), to verify that the refcounting is indeed correctly working.
This commit is contained in:
committed by
Pieter Wuille
parent
aaf47eac3a
commit
cedaa71446
14
src/net.cpp
14
src/net.cpp
@@ -453,7 +453,7 @@ CNode* FindNode(const CService& addr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CNode* ConnectNode(CAddress addrConnect, const char *pszDest, int64 nTimeout)
|
||||
CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
|
||||
{
|
||||
if (pszDest == NULL) {
|
||||
if (IsLocal(addrConnect))
|
||||
@@ -463,10 +463,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, int64 nTimeout)
|
||||
CNode* pnode = FindNode((CService)addrConnect);
|
||||
if (pnode)
|
||||
{
|
||||
if (nTimeout != 0)
|
||||
pnode->AddRef(nTimeout);
|
||||
else
|
||||
pnode->AddRef();
|
||||
pnode->AddRef();
|
||||
return pnode;
|
||||
}
|
||||
}
|
||||
@@ -498,10 +495,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, int64 nTimeout)
|
||||
|
||||
// Add node
|
||||
CNode* pnode = new CNode(hSocket, addrConnect, pszDest ? pszDest : "", false);
|
||||
if (nTimeout != 0)
|
||||
pnode->AddRef(nTimeout);
|
||||
else
|
||||
pnode->AddRef();
|
||||
pnode->AddRef();
|
||||
|
||||
{
|
||||
LOCK(cs_vNodes);
|
||||
@@ -615,7 +609,6 @@ void CNode::copyStats(CNodeStats &stats)
|
||||
X(nVersion);
|
||||
X(strSubVer);
|
||||
X(fInbound);
|
||||
X(nReleaseTime);
|
||||
X(nStartingHeight);
|
||||
X(nMisbehavior);
|
||||
}
|
||||
@@ -773,7 +766,6 @@ void ThreadSocketHandler()
|
||||
pnode->Cleanup();
|
||||
|
||||
// hold in disconnected pool until all refs are released
|
||||
pnode->nReleaseTime = max(pnode->nReleaseTime, GetTime() + 15 * 60);
|
||||
if (pnode->fNetworkNode || pnode->fInbound)
|
||||
pnode->Release();
|
||||
vNodesDisconnected.push_back(pnode);
|
||||
|
||||
Reference in New Issue
Block a user