summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-30 13:39:28 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-30 13:39:28 -0700
commit377ccff600859da2d0e7ecd65a38953bd471d04d (patch)
tree30d9190e4e5fc4bc5c432fbecbbda9c2961b9f4b
parentf974517f64aac6b527fefa8f3b30088b804d2ae2 (diff)
downloadinfinitytier-377ccff600859da2d0e7ecd65a38953bd471d04d.tar.gz
infinitytier-377ccff600859da2d0e7ecd65a38953bd471d04d.zip
getPeer() had a small potential to be unsafe.
-rw-r--r--node/Topology.cpp38
-rw-r--r--node/Topology.hpp2
2 files changed, 22 insertions, 18 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp
index 9027eff1..031c0b1b 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -146,26 +146,30 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta)
return SharedPtr<Peer>();
}
- Mutex::Lock _l(_lock);
-
- SharedPtr<Peer> &ap = _peers[zta];
-
- if (ap) {
- ap->use(RR->node->now());
- return ap;
+ {
+ Mutex::Lock _l(_lock);
+ const SharedPtr<Peer> *const ap = _peers.get(zta);
+ if (ap) {
+ (*ap)->use(RR->node->now());
+ return *ap;
+ }
}
- Identity id(_getIdentity(zta));
- if (id) {
- try {
- ap = SharedPtr<Peer>(new Peer(RR->identity,id));
- ap->use(RR->node->now());
- return ap;
- } catch ( ... ) {} // invalid identity?
- }
+ try {
+ Identity id(_getIdentity(zta));
+ if (id) {
+ SharedPtr<Peer> np(new Peer(RR->identity,id));
+ {
+ Mutex::Lock _l(_lock);
+ SharedPtr<Peer> &ap = _peers[zta];
+ if (!ap)
+ ap.swap(np);
+ ap->use(RR->node->now());
+ return ap;
+ }
+ }
+ } catch ( ... ) {} // invalid identity on disk?
- // If we get here it means we read an invalid cache identity or had some other error
- _peers.erase(zta);
return SharedPtr<Peer>();
}
diff --git a/node/Topology.hpp b/node/Topology.hpp
index b9f063c8..d6f453ac 100644
--- a/node/Topology.hpp
+++ b/node/Topology.hpp
@@ -87,7 +87,7 @@ public:
inline SharedPtr<Peer> getPeerNoCache(const Address &zta,const uint64_t now)
{
Mutex::Lock _l(_lock);
- const SharedPtr<Peer> *ap = _peers.get(zta);
+ const SharedPtr<Peer> *const ap = _peers.get(zta);
if (ap) {
(*ap)->use(now);
return *ap;