diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index ef517b5d33..85508664fe 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -500,10 +500,10 @@ bool NetworkOPs::gotTXData(boost::shared_ptr peer, const uint256& hash, return mConsensus->peerGaveNodes(peer, hash, nodeIDs, nodeData); } -bool NetworkOPs::hasTXSet(boost::shared_ptr peer, const std::vector& sets) +bool NetworkOPs::hasTXSet(boost::shared_ptr peer, const uint256& set, newcoin::TxSetStatus status) { if (!mConsensus) return false; - return mConsensus->peerHasSet(peer, sets); + return mConsensus->peerHasSet(peer, set, status); } void NetworkOPs::mapComplete(const uint256& hash, SHAMap::pointer map) diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index f7fd4c121b..005ef02a97 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -116,7 +116,7 @@ public: bool gotTXData(boost::shared_ptr peer, const uint256& hash, const std::list& nodeIDs, const std::list< std::vector >& nodeData); SHAMap::pointer getTXMap(const uint256& hash); - bool hasTXSet(boost::shared_ptr peer, const std::vector& sets); + bool hasTXSet(boost::shared_ptr peer, const uint256& set, newcoin::TxSetStatus status); void mapComplete(const uint256& hash, SHAMap::pointer map); // network state machine diff --git a/src/Peer.cpp b/src/Peer.cpp index 87b6dc8176..e4ef4938b0 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -636,17 +636,16 @@ void Peer::recvPropose(newcoin::TMProposeSet& packet) void Peer::recvHaveTxSet(newcoin::TMHaveTransactionSet& packet) { - std::vector hashes; - for (int i = 0; i < packet.hashes_size(); ++i) + // FIXME: We should have some limit on the number of HaveTxSet messages a peer can send us + // per consensus pass, to keep a peer from running up our memory without limit + uint256 hashes; + if (packet.hash().size() != (256 / 8)) { - if (packet.hashes(i).size() == 32) - { - uint256 hash; - memcpy(hash.begin(), packet.hashes(i).data(), 32); - hashes.push_back(hash); - } + punishPeer(PP_INVALID_REQUEST); + return; } - if (hashes.empty() || !theApp->getOPs().hasTXSet(shared_from_this(), hashes)) + memcpy(hashes.begin(), packet.hash().data(), 32); + if (!theApp->getOPs().hasTXSet(shared_from_this(), hashes, packet.status())) punishPeer(PP_UNWANTED_DATA); } @@ -846,9 +845,9 @@ void Peer::recvGetLedger(newcoin::TMGetLedger& packet) node->set_nodedata(&rawNodeIterator->front(), rawNodeIterator->size()); ++count; } - Log(lsTRACE) << "GetNodeFat: sending " << count << " nodes"; } } + if (packet.has_requestcookie()) reply.set_requestcookie(packet.requestcookie()); PackedMessage::pointer oPacket = boost::make_shared(reply, newcoin::mtLEDGER_DATA); Log(lsTRACE) << "sending reply"; sendPacket(oPacket);