Verify that outbound connections have expected services
This commit is contained in:
parent
3764dec36c
commit
fc83f18153
3 changed files with 15 additions and 0 deletions
|
@ -4616,6 +4616,15 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||
{
|
||||
addrman.SetServices(pfrom->addr, pfrom->nServices);
|
||||
}
|
||||
if (pfrom->nServicesExpected & ~pfrom->nServices)
|
||||
{
|
||||
LogPrint("net", "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom->id, pfrom->nServices, pfrom->nServicesExpected);
|
||||
pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,
|
||||
strprintf("Expected to offer services %08x", pfrom->nServicesExpected));
|
||||
pfrom->fDisconnect = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
|
||||
{
|
||||
// disconnect from peers older than this proto version
|
||||
|
|
|
@ -71,6 +71,9 @@ namespace {
|
|||
|
||||
const static std::string NET_MESSAGE_COMMAND_OTHER = "*other*";
|
||||
|
||||
/** Services this node implementation cares about */
|
||||
static const uint64_t nRelevantServices = NODE_NETWORK;
|
||||
|
||||
//
|
||||
// Global state variables
|
||||
//
|
||||
|
@ -409,6 +412,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure
|
|||
vNodes.push_back(pnode);
|
||||
}
|
||||
|
||||
pnode->nServicesExpected = addrConnect.nServices & nRelevantServices;
|
||||
pnode->nTimeConnected = GetTime();
|
||||
|
||||
return pnode;
|
||||
|
@ -2325,6 +2329,7 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
|
|||
filterInventoryKnown(50000, 0.000001)
|
||||
{
|
||||
nServices = 0;
|
||||
nServicesExpected = 0;
|
||||
hSocket = hSocketIn;
|
||||
nRecvVersion = INIT_PROTO_VERSION;
|
||||
nLastSend = 0;
|
||||
|
|
|
@ -317,6 +317,7 @@ class CNode
|
|||
public:
|
||||
// socket
|
||||
uint64_t nServices;
|
||||
uint64_t nServicesExpected;
|
||||
SOCKET hSocket;
|
||||
CDataStream ssSend;
|
||||
size_t nSendSize; // total size of all vSendMsg entries
|
||||
|
|
Loading…
Reference in a new issue