Browse Source

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.
miguelfreitas
Jeff Garzik 12 years ago committed by Jeff Garzik
parent
commit
bd2e140571
  1. 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…
Cancel
Save