aboutsummaryrefslogtreecommitdiff
path: root/src/db.cpp
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@exmulti.com>2012-10-08 13:41:57 -0400
committerJeff Garzik <jgarzik@redhat.com>2012-10-08 13:41:57 -0400
commitbd2e1405711f6ba81adadb6ea6206e916c29453b (patch)
tree08cbaac27f3f383c8a0fbd01988df12cd5df6355 /src/db.cpp
parenta6be58d536c46d2ee2328ed827cb26d35656fbee (diff)
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.
Diffstat (limited to 'src/db.cpp')
-rw-r--r--src/db.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/db.cpp b/src/db.cpp
index 867703fbd2..278c82078a 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -842,20 +842,22 @@ bool CAddrDB::Read(CAddrMan& addr)
if (hashIn != hashTmp)
return error("CAddrman::Read() : checksum mismatch; data corrupted");
- // de-serialize address data
unsigned char pchMsgTmp[4];
try {
+ // de-serialize file header (pchMessageStart magic number) and
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;
}
catch (std::exception &e) {
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;
}