diff --git a/ChangeLog b/ChangeLog index 2303e206..f3469e47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-02-12 Tatsuhiro Tsujikawa + + Use array_wrapper instead of array_ptr. + * src/DHTRoutingTableDeserializer.cc + 2009-02-12 Tatsuhiro Tsujikawa Removed template array_ptr(const array_ptr& s) diff --git a/src/DHTRoutingTableDeserializer.cc b/src/DHTRoutingTableDeserializer.cc index 8c03a3f9..d7446858 100644 --- a/src/DHTRoutingTableDeserializer.cc +++ b/src/DHTRoutingTableDeserializer.cc @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -65,6 +66,13 @@ const std::deque >& DHTRoutingTableDeserializer::getNodes( return _nodes; } +static std::istream& readBytes(unsigned char* buf, size_t buflen, + std::istream& in, size_t readlen) +{ + assert(readlen <= buflen); + return in.read(reinterpret_cast(buf), readlen); +} + void DHTRoutingTableDeserializer::deserialize(std::istream& in) { try { @@ -97,11 +105,10 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in) // If you change the code to read more than the size of buf, then // expand the buf size here. - char* buf = new char[255]; - array_ptr holder(buf); + array_wrapper buf; // header - in.read(buf, 8); + readBytes(buf, buf.size(), in, 8); if(memcmp(header, buf, 8) == 0) { version = 3; } else if(memcmp(headerCompat, buf, 8) == 0) { @@ -111,31 +118,34 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in) (StringFormat("Failed to load DHT routing table. cause:%s", "bad header").str()); } + + uint32_t temp32; + uint64_t temp64; // time if(version == 2) { - in.read(buf, 4); - _serializedTime.setTimeInSec(ntohl(*reinterpret_cast(buf))); + in.read(reinterpret_cast(&temp32), sizeof(temp32)); + _serializedTime.setTimeInSec(ntohl(temp32)); // 4bytes reserved - in.read(buf, 4); + readBytes(buf, buf.size(), in, 4); } else { - in.read(buf, 8); - _serializedTime.setTimeInSec(ntoh64(*reinterpret_cast(buf))); + in.read(reinterpret_cast(&temp64), sizeof(temp64)); + _serializedTime.setTimeInSec(ntoh64(temp64)); } // localnode // 8bytes reserved - in.read(buf, 8); + readBytes(buf, buf.size(), in, 8); // localnode ID - in.read(buf, DHT_ID_LENGTH); - SharedHandle localNode(new DHTNode(reinterpret_cast(buf))); + readBytes(buf, buf.size(), in, DHT_ID_LENGTH); + SharedHandle localNode(new DHTNode(buf)); // 4bytes reserved - in.read(buf, 4); + readBytes(buf, buf.size(), in, 4); // number of nodes - in.read(buf, 4); - uint32_t numNodes = ntohl(*reinterpret_cast(buf)); + in.read(reinterpret_cast(&temp32), sizeof(temp32)); + uint32_t numNodes = ntohl(temp32); // 4bytes reserved - in.read(buf, 4); + readBytes(buf, buf.size(), in, 4); // nodes for(size_t i = 0; i < numNodes; ++i) { @@ -145,37 +155,37 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in) in >> peerInfoLen; if(peerInfoLen != 6) { // skip this entry - in.read(buf, 42+7+6); + readBytes(buf, buf.size(), in, 42+7+6); continue; } // 7bytes reserved - in.read(buf, 7); + readBytes(buf, buf.size(), in, 7); // 6bytes compact peer info - in.read(buf, 6); + readBytes(buf, buf.size(), in, 6); if(memcmp(zero, buf, 6) == 0) { // skip this entry - in.read(buf, 42); + readBytes(buf, buf.size(), in, 42); continue; } std::pair peer = - PeerMessageUtil::unpackcompact(reinterpret_cast(buf)); + PeerMessageUtil::unpackcompact(buf); if(peer.first.empty()) { // skip this entry - in.read(buf, 42); + readBytes(buf, buf.size(), in, 42); continue; } // 2bytes reserved - in.read(buf, 2); + readBytes(buf, buf.size(), in, 2); // 16byte reserved - in.read(buf, 16); + readBytes(buf, buf.size(), in, 16); // localnode ID - in.read(buf, DHT_ID_LENGTH); + readBytes(buf, buf.size(), in, DHT_ID_LENGTH); - SharedHandle node(new DHTNode(reinterpret_cast(buf))); + SharedHandle node(new DHTNode(buf)); node->setIPAddress(peer.first); node->setPort(peer.second); // 4bytes reserved - in.read(buf, 4); + readBytes(buf, buf.size(), in, 4); _nodes.push_back(node); }