Browse Source

Fix attempt to WHOIS self.

Adam Ierymenko 8 years ago
parent
commit
cdc0eaec3a
5 changed files with 26 additions and 10 deletions
  1. 1 0
      .gitignore
  2. 1 1
      make-linux.mk
  3. 5 1
      node/IncomingPacket.cpp
  4. 7 0
      node/Switch.cpp
  5. 12 8
      node/Topology.hpp

+ 1 - 0
.gitignore

@@ -10,6 +10,7 @@
 .DS_Store
 .DS_Store
 .Apple*
 .Apple*
 Thumbs.db
 Thumbs.db
+@eaDir
 
 
 # Windows build droppings
 # Windows build droppings
 /windows/ZeroTierOne.sdf
 /windows/ZeroTierOne.sdf

+ 1 - 1
make-linux.mk

@@ -54,7 +54,7 @@ ifeq ($(ZT_RULES_ENGINE_DEBUGGING),1)
 endif
 endif
 
 
 ifeq ($(ZT_DEBUG),1)
 ifeq ($(ZT_DEBUG),1)
-#	DEFS+=-DZT_TRACE
+	DEFS+=-DZT_TRACE
 	override CFLAGS+=-Wall -g -O -pthread $(INCLUDES) $(DEFS)
 	override CFLAGS+=-Wall -g -O -pthread $(INCLUDES) $(DEFS)
 	override CXXFLAGS+=-Wall -g -O -std=c++11 -pthread $(INCLUDES) $(DEFS)
 	override CXXFLAGS+=-Wall -g -O -std=c++11 -pthread $(INCLUDES) $(DEFS)
 	override LDFLAGS+=
 	override LDFLAGS+=

+ 5 - 1
node/IncomingPacket.cpp

@@ -477,7 +477,11 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
 					} else ptr += 2;
 					} else ptr += 2;
 				}
 				}
 
 
-				TRACE("%s(%s): OK(HELLO), version %u.%u.%u, latency %u, reported external address %s",source().toString().c_str(),_path->address().toString().c_str(),vMajor,vMinor,vRevision,latency,((externalSurfaceAddress) ? externalSurfaceAddress.toString().c_str() : "(none)"));
+#ifdef ZT_TRACE
+				const std::string tmp1(source().toString());
+				const std::string tmp2(_path->address().toString());
+				TRACE("%s(%s): OK(HELLO), version %u.%u.%u, latency %u",tmp1.c_str(),tmp2.c_str(),vMajor,vMinor,vRevision,latency);
+#endif
 
 
 				if (!hops())
 				if (!hops())
 					peer->addDirectLatencyMeasurment((unsigned int)latency);
 					peer->addDirectLatencyMeasurment((unsigned int)latency);

+ 7 - 0
node/Switch.cpp

@@ -625,6 +625,13 @@ void Switch::send(Packet &packet,bool encrypt)
 
 
 void Switch::requestWhois(const Address &addr)
 void Switch::requestWhois(const Address &addr)
 {
 {
+#ifdef ZT_TRACE
+	if (addr == RR->identity.address()) {
+		fprintf(stderr,"FATAL BUG: Switch::requestWhois() caught attempt to WHOIS self" ZT_EOL_S);
+		abort();
+	}
+#endif
+
 	bool inserted = false;
 	bool inserted = false;
 	{
 	{
 		Mutex::Lock _l(_outstandingWhoisRequests_m);
 		Mutex::Lock _l(_outstandingWhoisRequests_m);

+ 12 - 8
node/Topology.hpp

@@ -184,14 +184,7 @@ public:
 	{
 	{
 		Mutex::Lock _l(_upstreams_m);
 		Mutex::Lock _l(_upstreams_m);
 		for(std::vector<World::Root>::const_iterator i(_planet.roots().begin());i!=_planet.roots().end();++i) {
 		for(std::vector<World::Root>::const_iterator i(_planet.roots().begin());i!=_planet.roots().end();++i) {
-			std::vector<InetAddress> &ips = eps[i->identity.address()];
-			for(std::vector<InetAddress>::const_iterator j(i->stableEndpoints.begin());j!=i->stableEndpoints.end();++j) {
-				if (std::find(ips.begin(),ips.end(),*j) == ips.end())
-					ips.push_back(*j);
-			}
-		}
-		for(std::vector<World>::const_iterator m(_moons.begin());m!=_moons.end();++m) {
-			for(std::vector<World::Root>::const_iterator i(m->roots().begin());i!=m->roots().end();++i) {
+			if (i->identity != RR->identity) {
 				std::vector<InetAddress> &ips = eps[i->identity.address()];
 				std::vector<InetAddress> &ips = eps[i->identity.address()];
 				for(std::vector<InetAddress>::const_iterator j(i->stableEndpoints.begin());j!=i->stableEndpoints.end();++j) {
 				for(std::vector<InetAddress>::const_iterator j(i->stableEndpoints.begin());j!=i->stableEndpoints.end();++j) {
 					if (std::find(ips.begin(),ips.end(),*j) == ips.end())
 					if (std::find(ips.begin(),ips.end(),*j) == ips.end())
@@ -199,6 +192,17 @@ public:
 				}
 				}
 			}
 			}
 		}
 		}
+		for(std::vector<World>::const_iterator m(_moons.begin());m!=_moons.end();++m) {
+			for(std::vector<World::Root>::const_iterator i(m->roots().begin());i!=m->roots().end();++i) {
+				if (i->identity != RR->identity) {
+					std::vector<InetAddress> &ips = eps[i->identity.address()];
+					for(std::vector<InetAddress>::const_iterator j(i->stableEndpoints.begin());j!=i->stableEndpoints.end();++j) {
+						if (std::find(ips.begin(),ips.end(),*j) == ips.end())
+							ips.push_back(*j);
+					}
+				}
+			}
+		}
 		for(std::vector< std::pair<uint64_t,Address> >::const_iterator m(_moonSeeds.begin());m!=_moonSeeds.end();++m)
 		for(std::vector< std::pair<uint64_t,Address> >::const_iterator m(_moonSeeds.begin());m!=_moonSeeds.end();++m)
 			eps[m->second];
 			eps[m->second];
 	}
 	}