Move CNode::addrLocal access behind locked accessors
zcash: cherry picked from commit db2dc7a58cb0a3df58188b748df8e0d04ba76f00 zcash: https://github.com/bitcoin/bitcoin/pull/9708
This commit is contained in:
parent
116deeec5b
commit
c9e2172eb6
|
@ -5776,7 +5776,7 @@ bool static ProcessMessage(const CChainParams& chainparams, CNode* pfrom, string
|
|||
return true;
|
||||
}
|
||||
|
||||
pfrom->addrLocal = addrMe;
|
||||
pfrom->SetAddrLocal(addrMe);
|
||||
if (pfrom->fInbound && addrMe.IsRoutable())
|
||||
{
|
||||
SeenLocal(addrMe);
|
||||
|
@ -5815,7 +5815,7 @@ bool static ProcessMessage(const CChainParams& chainparams, CNode* pfrom, string
|
|||
LogPrintf("ProcessMessages: advertizing address %s\n", addr.ToString());
|
||||
pfrom->PushAddress(addr, insecure_rand);
|
||||
} else if (IsPeerAddrLocalGood(pfrom)) {
|
||||
addr.SetIP(pfrom->addrLocal);
|
||||
addr.SetIP(addrMe);
|
||||
LogPrintf("ProcessMessages: advertizing address %s\n", addr.ToString());
|
||||
pfrom->PushAddress(addr, insecure_rand);
|
||||
}
|
||||
|
|
24
src/net.cpp
24
src/net.cpp
|
@ -192,8 +192,9 @@ int GetnScore(const CService& addr)
|
|||
// Is our peer's addrLocal potentially useful as an external IP source?
|
||||
bool IsPeerAddrLocalGood(CNode *pnode)
|
||||
{
|
||||
return fDiscover && pnode->addr.IsRoutable() && pnode->addrLocal.IsRoutable() &&
|
||||
!IsLimited(pnode->addrLocal.GetNetwork());
|
||||
CService addrLocal = pnode->GetAddrLocal();
|
||||
return fDiscover && pnode->addr.IsRoutable() && addrLocal.IsRoutable() &&
|
||||
!IsLimited(addrLocal.GetNetwork());
|
||||
}
|
||||
|
||||
// pushes our own address to a peer
|
||||
|
@ -208,7 +209,7 @@ void AdvertizeLocal(CNode *pnode)
|
|||
if (IsPeerAddrLocalGood(pnode) && (!addrLocal.IsRoutable() ||
|
||||
GetRand((GetnScore(addrLocal) > LOCAL_MANUAL) ? 8:2) == 0))
|
||||
{
|
||||
addrLocal.SetIP(pnode->addrLocal);
|
||||
addrLocal.SetIP(pnode->GetAddrLocal());
|
||||
}
|
||||
if (addrLocal.IsRoutable())
|
||||
{
|
||||
|
@ -652,6 +653,20 @@ void CNode::MaybeSetAddrName(const std::string& addrNameIn) {
|
|||
}
|
||||
}
|
||||
|
||||
CService CNode::GetAddrLocal() const {
|
||||
LOCK(cs_addrLocal);
|
||||
return addrLocal;
|
||||
}
|
||||
|
||||
void CNode::SetAddrLocal(const CService& addrLocalIn) {
|
||||
LOCK(cs_addrLocal);
|
||||
if (addrLocal.IsValid()) {
|
||||
error("Addr local already set for node: %i. Refusing to change from %s to %s", id, addrLocal.ToString(), addrLocalIn.ToString());
|
||||
} else {
|
||||
addrLocal = addrLocalIn;
|
||||
}
|
||||
}
|
||||
|
||||
void CNode::copyStats(CNodeStats &stats)
|
||||
{
|
||||
stats.nodeid = this->GetId();
|
||||
|
@ -698,7 +713,8 @@ void CNode::copyStats(CNodeStats &stats)
|
|||
stats.dPingWait = (((double)nPingUsecWait) / 1e6);
|
||||
|
||||
// Leave string empty if addrLocal invalid (not filled in yet)
|
||||
stats.addrLocal = addrLocal.IsValid() ? addrLocal.ToString() : "";
|
||||
CService addrLocalUnlocked = GetAddrLocal();
|
||||
stats.addrLocal = addrLocalUnlocked.IsValid() ? addrLocalUnlocked.ToString() : "";
|
||||
}
|
||||
|
||||
// requires LOCK(cs_vRecvMsg)
|
||||
|
|
|
@ -279,7 +279,6 @@ public:
|
|||
const int64_t nTimeConnected;
|
||||
std::atomic<int64_t> nTimeOffset;
|
||||
const CAddress addr;
|
||||
CService addrLocal;
|
||||
int nVersion;
|
||||
// strSubVer is whatever byte array we read from the wire. However, this field is intended
|
||||
// to be printed out, displayed to humans in various forms and so on. So we sanitize it and
|
||||
|
@ -381,6 +380,9 @@ private:
|
|||
|
||||
mutable CCriticalSection cs_addrName;
|
||||
std::string addrName;
|
||||
|
||||
CService addrLocal;
|
||||
mutable CCriticalSection cs_addrLocal;
|
||||
public:
|
||||
|
||||
// Regenerate the span for this CNode. This re-queries the log filter to see
|
||||
|
@ -417,6 +419,10 @@ public:
|
|||
msg.SetVersion(nVersionIn);
|
||||
}
|
||||
|
||||
CService GetAddrLocal() const;
|
||||
//! May not be called more than once
|
||||
void SetAddrLocal(const CService& addrLocalIn);
|
||||
|
||||
CNode* AddRef()
|
||||
{
|
||||
nRefCount++;
|
||||
|
|
Loading…
Reference in New Issue