Pārlūkot izejas kodu

getPeer() had a small potential to be unsafe.

Adam Ierymenko 9 gadi atpakaļ
vecāks
revīzija
377ccff600
2 mainītis faili ar 22 papildinājumiem un 18 dzēšanām
  1. 21 17
      node/Topology.cpp
  2. 1 1
      node/Topology.hpp

+ 21 - 17
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>();
 }
 

+ 1 - 1
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;