more addr message error checking
-- version 0.2.11
This commit is contained in:
parent
78c7bb8e26
commit
d0ac235c8f
5
main.cpp
5
main.cpp
@ -1926,7 +1926,9 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|||||||
{
|
{
|
||||||
vector<CAddress> vAddr;
|
vector<CAddress> vAddr;
|
||||||
vRecv >> vAddr;
|
vRecv >> vAddr;
|
||||||
if (vAddr.size() > 50000) // lower this to 1000 later
|
if (pfrom->nVersion < 200) // don't want addresses from 0.1.5
|
||||||
|
return true;
|
||||||
|
if (vAddr.size() > 1000)
|
||||||
return error("message addr size() = %d", vAddr.size());
|
return error("message addr size() = %d", vAddr.size());
|
||||||
|
|
||||||
// Store the new addresses
|
// Store the new addresses
|
||||||
@ -2311,6 +2313,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
|||||||
if (pto->setAddrKnown.insert(addr).second)
|
if (pto->setAddrKnown.insert(addr).second)
|
||||||
{
|
{
|
||||||
vAddr.push_back(addr);
|
vAddr.push_back(addr);
|
||||||
|
// receiver rejects addr messages larger than 1000
|
||||||
if (vAddr.size() >= 1000)
|
if (vAddr.size() >= 1000)
|
||||||
{
|
{
|
||||||
pto->PushMessage("addr", vAddr);
|
pto->PushMessage("addr", vAddr);
|
||||||
|
6
net.cpp
6
net.cpp
@ -968,9 +968,9 @@ bool OpenNetworkConnection(const CAddress& addrConnect)
|
|||||||
if (addrLocalHost.IsRoutable() && !fUseProxy)
|
if (addrLocalHost.IsRoutable() && !fUseProxy)
|
||||||
{
|
{
|
||||||
// Advertise our address
|
// Advertise our address
|
||||||
vector<CAddress> vAddrToSend;
|
vector<CAddress> vAddr;
|
||||||
vAddrToSend.push_back(addrLocalHost);
|
vAddr.push_back(addrLocalHost);
|
||||||
pnode->PushMessage("addr", vAddrToSend);
|
pnode->PushMessage("addr", vAddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get as many addresses as we can
|
// Get as many addresses as we can
|
||||||
|
22
net.h
22
net.h
@ -289,16 +289,24 @@ public:
|
|||||||
|
|
||||||
bool IsRoutable() const
|
bool IsRoutable() const
|
||||||
{
|
{
|
||||||
return !(GetByte(3) == 10 ||
|
return IsValid() &&
|
||||||
(GetByte(3) == 192 && GetByte(2) == 168) ||
|
!(GetByte(3) == 10 ||
|
||||||
GetByte(3) == 127 ||
|
(GetByte(3) == 192 && GetByte(2) == 168) ||
|
||||||
GetByte(3) == 0 ||
|
GetByte(3) == 127 ||
|
||||||
ip == 0 ||
|
GetByte(3) == 0);
|
||||||
ip == INADDR_NONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValid() const
|
bool IsValid() const
|
||||||
{
|
{
|
||||||
|
// Clean up 3-byte shifted addresses caused by garbage in size field
|
||||||
|
// of addr messages from versions before 0.2.9 checksum.
|
||||||
|
// Two consecutive addr messages look like this:
|
||||||
|
// header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
|
||||||
|
// so if the first length field is garbled, it reads the second batch
|
||||||
|
// of addr misaligned by 3 bytes.
|
||||||
|
if (memcmp(pchReserved, pchIPv4+3, sizeof(pchIPv4)-3) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
return (ip != 0 && ip != INADDR_NONE && port != htons(USHRT_MAX));
|
return (ip != 0 && ip != INADDR_NONE && port != htons(USHRT_MAX));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,7 +627,7 @@ public:
|
|||||||
// Known checking here is only to save space from duplicates.
|
// Known checking here is only to save space from duplicates.
|
||||||
// SendMessages will filter it again for knowns that were added
|
// SendMessages will filter it again for knowns that were added
|
||||||
// after addresses were pushed.
|
// after addresses were pushed.
|
||||||
if (!setAddrKnown.count(addr))
|
if (addr.IsValid() && !setAddrKnown.count(addr))
|
||||||
vAddrToSend.push_back(addr);
|
vAddrToSend.push_back(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class CScript;
|
|||||||
class CDataStream;
|
class CDataStream;
|
||||||
class CAutoFile;
|
class CAutoFile;
|
||||||
|
|
||||||
static const int VERSION = 210;
|
static const int VERSION = 211;
|
||||||
static const char* pszSubVer = ".0";
|
static const char* pszSubVer = ".0";
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user