summaryrefslogtreecommitdiff
path: root/src/DefaultPeerStorage.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-01-10 14:59:11 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-01-10 14:59:11 +0000
commitf412691770ec1c2a81567156f4cf23cb26b4e75d (patch)
treec0f2cbf1a1a27712f25c4764738362bfbd8fe06f /src/DefaultPeerStorage.cc
parentb1b20abe02f58abcf2cb05ce240e239d0312f8fc (diff)
2008-01-10 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Fixed the bug that DefaultPeerStorage::returnPeer() may delete wrong peer if there are peers that have same ipaddr and port. I've experiened segmentation fault and "pure virtual function was called" error. * src/Peer.h * test/PeerTest.cc * src/DefaultPeerStorage.cc * test/DefaultPeerStorageTest.cc
Diffstat (limited to 'src/DefaultPeerStorage.cc')
-rw-r--r--src/DefaultPeerStorage.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc
index 059cf0b6..65dbf7b5 100644
--- a/src/DefaultPeerStorage.cc
+++ b/src/DefaultPeerStorage.cc
@@ -52,9 +52,21 @@ DefaultPeerStorage::DefaultPeerStorage(BtContextHandle btContext,
DefaultPeerStorage::~DefaultPeerStorage() {}
+class FindIdenticalPeer {
+private:
+ PeerHandle _peer;
+public:
+ FindIdenticalPeer(const PeerHandle& peer):_peer(peer) {}
+
+ bool operator()(const PeerHandle& peer) const {
+ return _peer == peer ||
+ _peer->ipaddr == peer->ipaddr && _peer->port == peer->port;
+ }
+};
+
bool DefaultPeerStorage::isPeerAlreadyAdded(const PeerHandle& peer)
{
- return find(peers.begin(), peers.end(), peer) != peers.end();
+ return find_if(peers.begin(), peers.end(), FindIdenticalPeer(peer)) != peers.end();
}
bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {