Skip to content

Commit

Permalink
Move CNode::addrLocal access behind locked accessors
Browse files Browse the repository at this point in the history
  • Loading branch information
Fuzzbawls committed Sep 2, 2020
1 parent 470482f commit 2ae76aa
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5359,7 +5359,7 @@ bool static ProcessMessage(CNode* pfrom, std::string strCommand, CDataStream& vR
connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERACK));

pfrom->nServices = nServices;
pfrom->addrLocal = addrMe;
pfrom->SetAddrLocal(addrMe);
{
LOCK(pfrom->cs_SubVer);
pfrom->strSubVer = strSubVer;
Expand Down Expand Up @@ -5391,7 +5391,7 @@ bool static ProcessMessage(CNode* pfrom, std::string strCommand, CDataStream& vR
LogPrintf("ProcessMessages: advertising address %s\n", addr.ToString());
pfrom->PushAddress(addr, insecure_rand);
} else if (IsPeerAddrLocalGood(pfrom)) {
addr.SetIP(pfrom->addrLocal);
addr.SetIP(addrMe);
LogPrintf("ProcessMessages: advertising address %s\n", addr.ToString());
pfrom->PushAddress(addr, insecure_rand);
}
Expand Down
24 changes: 20 additions & 4 deletions src/net.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,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
Expand All @@ -221,7 +222,7 @@ void AdvertiseLocal(CNode* pnode)
// address than we do.
if (IsPeerAddrLocalGood(pnode) && (!addrLocal.IsRoutable() ||
GetRand((GetnScore(addrLocal) > LOCAL_MANUAL) ? 8 : 2) == 0)) {
addrLocal.SetIP(pnode->addrLocal);
addrLocal.SetIP(pnode->GetAddrLocal());
}
if (addrLocal.IsRoutable()) {
LogPrintf("%s: advertising address %s\n", __func__, addrLocal.ToString());
Expand Down Expand Up @@ -662,6 +663,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;
}
}

#undef X
#define X(name) stats.name = name
void CNode::copyStats(CNodeStats& stats)
Expand Down Expand Up @@ -708,7 +723,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() : "";
}
#undef X

Expand Down
8 changes: 7 additions & 1 deletion src/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,6 @@ class CNode
const int64_t nTimeConnected;
std::atomic<int64_t> nTimeOffset;
const CAddress addr;
CService addrLocal;
std::atomic<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
Expand Down Expand Up @@ -647,6 +646,9 @@ class CNode

mutable RecursiveMutex cs_addrName;
std::string addrName;

CService addrLocal;
mutable RecursiveMutex cs_addrLocal;
public:
NodeId GetId() const
{
Expand Down Expand Up @@ -688,6 +690,10 @@ class CNode
void SetSendVersion(int nVersionIn);
int GetSendVersion() const;

CService GetAddrLocal() const;
//! May not be called more than once
void SetAddrLocal(const CService& addrLocalIn);

CNode* AddRef()
{
nRefCount++;
Expand Down

0 comments on commit 2ae76aa

Please sign in to comment.