CAddrMan: verify pchMessageStart file marker, before reading address data
This avoids the case where you read the address data, before noticing it is the wrong network.
This commit is contained in:
parent
a6be58d536
commit
bd2e140571
1 changed files with 7 additions and 5 deletions
12
src/db.cpp
12
src/db.cpp
|
@ -842,20 +842,22 @@ bool CAddrDB::Read(CAddrMan& addr)
|
||||||
if (hashIn != hashTmp)
|
if (hashIn != hashTmp)
|
||||||
return error("CAddrman::Read() : checksum mismatch; data corrupted");
|
return error("CAddrman::Read() : checksum mismatch; data corrupted");
|
||||||
|
|
||||||
// de-serialize address data
|
|
||||||
unsigned char pchMsgTmp[4];
|
unsigned char pchMsgTmp[4];
|
||||||
try {
|
try {
|
||||||
|
// de-serialize file header (pchMessageStart magic number) and
|
||||||
ssPeers >> FLATDATA(pchMsgTmp);
|
ssPeers >> FLATDATA(pchMsgTmp);
|
||||||
|
|
||||||
|
// verify the network matches ours
|
||||||
|
if (memcmp(pchMsgTmp, pchMessageStart, sizeof(pchMsgTmp)))
|
||||||
|
return error("CAddrman::Read() : invalid network magic number");
|
||||||
|
|
||||||
|
// de-serialize address data into one CAddrMan object
|
||||||
ssPeers >> addr;
|
ssPeers >> addr;
|
||||||
}
|
}
|
||||||
catch (std::exception &e) {
|
catch (std::exception &e) {
|
||||||
return error("CAddrman::Read() : I/O error or stream data corrupted");
|
return error("CAddrman::Read() : I/O error or stream data corrupted");
|
||||||
}
|
}
|
||||||
|
|
||||||
// finally, verify the network matches ours
|
|
||||||
if (memcmp(pchMsgTmp, pchMessageStart, sizeof(pchMsgTmp)))
|
|
||||||
return error("CAddrman::Read() : invalid network magic number");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue