diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-01-10 14:59:11 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-01-10 14:59:11 +0000 |
| commit | f412691770ec1c2a81567156f4cf23cb26b4e75d (patch) | |
| tree | c0f2cbf1a1a27712f25c4764738362bfbd8fe06f /src/DefaultPeerStorage.cc | |
| parent | b1b20abe02f58abcf2cb05ce240e239d0312f8fc (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.cc | 14 |
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) { |
