diff --git a/node/AntiRecursion.hpp b/node/AntiRecursion.hpp index 8629d19a9..4d9df465c 100644 --- a/node/AntiRecursion.hpp +++ b/node/AntiRecursion.hpp @@ -58,7 +58,12 @@ class AntiRecursion public: AntiRecursion() { - memset(_history,0,sizeof(_history)); + for(int i=0;itopology->countActive()); + alive.append((uint64_t)RR->topology->countActive(now)); alive.append((uint64_t)0); // unused/reserved flags alive.append((uint8_t)_zeroTierPhysicalEndpoints.size()); for(std::vector::const_iterator pe(_zeroTierPhysicalEndpoints.begin());pe!=_zeroTierPhysicalEndpoints.end();++pe) @@ -769,7 +769,7 @@ void Cluster::status(ZT_ClusterStatus &status) const s->y = _y; s->z = _z; s->load = 0; // TODO - s->peers = RR->topology->countActive(); + s->peers = RR->topology->countActive(now); for(std::vector::const_iterator ep(_zeroTierPhysicalEndpoints.begin());ep!=_zeroTierPhysicalEndpoints.end();++ep) { if (s->numZeroTierPhysicalEndpoints >= ZT_CLUSTER_MAX_ZT_PHYSICAL_ADDRESSES) // sanity check break; diff --git a/node/Identity.cpp b/node/Identity.cpp index e5aaf13db..4611f6a53 100644 --- a/node/Identity.cpp +++ b/node/Identity.cpp @@ -158,7 +158,7 @@ bool Identity::fromString(const char *str) return false; char *saveptr = (char *)0; - char tmp[4096]; + char tmp[1024]; if (!Utils::scopy(tmp,sizeof(tmp),str)) return false; diff --git a/node/Node.cpp b/node/Node.cpp index 4b449401e..f077424bc 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -93,21 +93,22 @@ Node::Node( _prng.encrypt12(_prngStream,_prngStream,sizeof(_prngStream)); } - std::string idtmp(dataStoreGet("identity.secret")); - if ((!idtmp.length())||(!RR->identity.fromString(idtmp))||(!RR->identity.hasPrivate())) { - TRACE("identity.secret not found, generating..."); - RR->identity.generate(); - idtmp = RR->identity.toString(true); - if (!dataStorePut("identity.secret",idtmp,true)) - throw std::runtime_error("unable to write identity.secret"); - } - RR->publicIdentityStr = RR->identity.toString(false); - RR->secretIdentityStr = RR->identity.toString(true); - - idtmp = dataStoreGet("identity.public"); - if (idtmp != RR->publicIdentityStr) { - if (!dataStorePut("identity.public",RR->publicIdentityStr,false)) - throw std::runtime_error("unable to write identity.public"); + { + std::string idtmp(dataStoreGet("identity.secret")); + if ((!idtmp.length())||(!RR->identity.fromString(idtmp))||(!RR->identity.hasPrivate())) { + TRACE("identity.secret not found, generating..."); + RR->identity.generate(); + idtmp = RR->identity.toString(true); + if (!dataStorePut("identity.secret",idtmp,true)) + throw std::runtime_error("unable to write identity.secret"); + } + RR->publicIdentityStr = RR->identity.toString(false); + RR->secretIdentityStr = RR->identity.toString(true); + idtmp = dataStoreGet("identity.public"); + if (idtmp != RR->publicIdentityStr) { + if (!dataStorePut("identity.public",RR->publicIdentityStr,false)) + throw std::runtime_error("unable to write identity.public"); + } } try { @@ -662,7 +663,7 @@ void Node::backgroundThreadMain() std::string Node::dataStoreGet(const char *name) { - char buf[16384]; + char buf[1024]; std::string r; unsigned long olen = 0; do { diff --git a/node/Topology.cpp b/node/Topology.cpp index 5379ac1f4..1617dd94f 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -50,6 +50,7 @@ Topology::Topology(const RuntimeEnvironment *renv) : const uint8_t *all = reinterpret_cast(alls.data()); RR->node->dataStoreDelete("peers.save"); + Buffer *deserializeBuf = new Buffer(); unsigned int ptr = 0; while ((ptr + 4) < alls.size()) { try { @@ -60,7 +61,8 @@ Topology::Topology(const RuntimeEnvironment *renv) : (((unsigned int)all[ptr + 3]) & 0xff) ); unsigned int pos = 0; - SharedPtr p(Peer::deserializeNew(RR->identity,Buffer(all + ptr,reclen + 4),pos)); + deserializeBuf->copyFrom(all + ptr,reclen + 4); + SharedPtr p(Peer::deserializeNew(RR->identity,*deserializeBuf,pos)); ptr += pos; if (!p) break; // stop if invalid records @@ -70,16 +72,19 @@ Topology::Topology(const RuntimeEnvironment *renv) : break; // stop if invalid records } } + delete deserializeBuf; clean(RR->node->now()); std::string dsWorld(RR->node->dataStoreGet("world")); World cachedWorld; - try { - Buffer dswtmp(dsWorld.data(),(unsigned int)dsWorld.length()); - cachedWorld.deserialize(dswtmp,0); - } catch ( ... ) { - cachedWorld = World(); // clear if cached world is invalid + if (dsWorld.length() > 0) { + try { + Buffer dswtmp(dsWorld.data(),(unsigned int)dsWorld.length()); + cachedWorld.deserialize(dswtmp,0); + } catch ( ... ) { + cachedWorld = World(); // clear if cached world is invalid + } } World defaultWorld; { @@ -315,20 +320,6 @@ void Topology::clean(uint64_t now) } } -unsigned long Topology::countActive() const -{ - const uint64_t now = RR->node->now(); - unsigned long cnt = 0; - Mutex::Lock _l(_lock); - Hashtable< Address,SharedPtr >::Iterator i(const_cast(this)->_peers); - Address *a = (Address *)0; - SharedPtr *p = (SharedPtr *)0; - while (i.next(a,p)) { - cnt += (unsigned long)((*p)->hasActiveDirectPath(now)); - } - return cnt; -} - Identity Topology::_getIdentity(const Address &zta) { char p[128]; diff --git a/node/Topology.hpp b/node/Topology.hpp index 68ad273fa..a9a5f2f99 100644 --- a/node/Topology.hpp +++ b/node/Topology.hpp @@ -200,9 +200,21 @@ public: void clean(uint64_t now); /** + * @param now Current time * @return Number of peers with active direct paths */ - unsigned long countActive() const; + inline unsigned long countActive(uint64_t now) const + { + unsigned long cnt = 0; + Mutex::Lock _l(_lock); + Hashtable< Address,SharedPtr >::Iterator i(const_cast(this)->_peers); + Address *a = (Address *)0; + SharedPtr *p = (SharedPtr *)0; + while (i.next(a,p)) { + cnt += (unsigned long)((*p)->hasActiveDirectPath(now)); + } + return cnt; + } /** * Apply a function or function object to all peers @@ -253,7 +265,7 @@ private: Identity _getIdentity(const Address &zta); void _setWorld(const World &newWorld); - const RuntimeEnvironment *RR; + const RuntimeEnvironment *const RR; World _world; Hashtable< Address,SharedPtr > _peers; diff --git a/one.cpp b/one.cpp index c8661fda4..11bcc11e7 100644 --- a/one.cpp +++ b/one.cpp @@ -958,13 +958,15 @@ int main(int argc,char **argv) #endif // __UNIX_LIKE__ #ifdef __WINDOWS__ - WSADATA wsaData; - WSAStartup(MAKEWORD(2,2),&wsaData); + { + WSADATA wsaData; + WSAStartup(MAKEWORD(2,2),&wsaData); + } #ifdef ZT_WIN_RUN_IN_CONSOLE bool winRunFromCommandLine = true; #else - bool winRunFromCommandLine = false; + bool winRunFromCommandLine = true; #endif #endif // __WINDOWS__ @@ -1153,37 +1155,29 @@ int main(int argc,char **argv) unsigned int returnValue = 0; - try { - for(;;) { - zt1Service = OneService::newInstance(homeDir.c_str(),port); - switch(zt1Service->run()) { - case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done - case OneService::ONE_NORMAL_TERMINATION: - break; - case OneService::ONE_UNRECOVERABLE_ERROR: - fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],zt1Service->fatalErrorMessage().c_str()); - returnValue = 1; - break; - case OneService::ONE_IDENTITY_COLLISION: { - delete zt1Service; - zt1Service = (OneService *)0; - std::string oldid; - OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid); - if (oldid.length()) { - OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid); - OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str()); - OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str()); - } - } continue; // restart! - } - break; // terminate loop -- normally we don't keep restarting + for(;;) { + zt1Service = OneService::newInstance(homeDir.c_str(),port); + switch(zt1Service->run()) { + case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done + case OneService::ONE_NORMAL_TERMINATION: + break; + case OneService::ONE_UNRECOVERABLE_ERROR: + fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],zt1Service->fatalErrorMessage().c_str()); + returnValue = 1; + break; + case OneService::ONE_IDENTITY_COLLISION: { + delete zt1Service; + zt1Service = (OneService *)0; + std::string oldid; + OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid); + if (oldid.length()) { + OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid); + OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str()); + OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str()); + } + } continue; // restart! } - } catch (std::exception &exc) { - fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],exc.what()); - returnValue = 1; - } catch ( ... ) { - fprintf(stderr,"%s: fatal error: unknown exception"ZT_EOL_S,argv[0]); - returnValue = 1; + break; // terminate loop -- normally we don't keep restarting } delete zt1Service; diff --git a/osdep/OSUtils.cpp b/osdep/OSUtils.cpp index 45fbf1003..728704e5e 100644 --- a/osdep/OSUtils.cpp +++ b/osdep/OSUtils.cpp @@ -206,7 +206,7 @@ skip_add_inetaddr: bool OSUtils::readFile(const char *path,std::string &buf) { - char tmp[4096]; + char tmp[1024]; FILE *f = fopen(path,"rb"); if (f) { for(;;) { diff --git a/osdep/WindowsEthernetTap.cpp b/osdep/WindowsEthernetTap.cpp index f327009d3..5b2bc1541 100644 --- a/osdep/WindowsEthernetTap.cpp +++ b/osdep/WindowsEthernetTap.cpp @@ -213,7 +213,7 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf, Mutex::Lock _l(_systemDeviceManagementLock); GUID classGuid; - char className[4096]; + char className[1024]; if (!WINENV.SetupDiGetINFClassA(pathToInf,&classGuid,className,sizeof(className),(PDWORD)0)) { return std::string("SetupDiGetINFClassA() failed -- unable to read zttap driver INF file"); } @@ -269,9 +269,9 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf, std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices() { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; std::set instanceIdPathsToRemove; { @@ -321,9 +321,9 @@ std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices() std::string WindowsEthernetTap::destroyAllPersistentTapDevices() { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; std::set instanceIdPathsToRemove; { @@ -479,9 +479,9 @@ WindowsEthernetTap::WindowsEthernetTap( _initialized(false), _enabled(true) { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; char tag[24]; std::string mySubkeyName; diff --git a/selftest.cpp b/selftest.cpp index fa8df48bf..87043ddd6 100644 --- a/selftest.cpp +++ b/selftest.cpp @@ -860,8 +860,9 @@ struct TestPhyHandlers inline void phyOnUnixClose(PhySocket *sock,void **uptr) {} inline void phyOnUnixData(PhySocket *sock,void **uptr,void *data,unsigned long len) {} inline void phyOnUnixWritable(PhySocket *sock,void **uptr) {} - inline void phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,bool readable,bool writable) {} #endif // __UNIX_LIKE__ + + inline void phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,bool readable,bool writable) {} }; static int testPhy() { diff --git a/windows/ZeroTierOne/ZeroTierOne.vcxproj b/windows/ZeroTierOne/ZeroTierOne.vcxproj index c31636089..82b70400f 100644 --- a/windows/ZeroTierOne/ZeroTierOne.vcxproj +++ b/windows/ZeroTierOne/ZeroTierOne.vcxproj @@ -24,6 +24,7 @@ + @@ -44,18 +45,14 @@ - + + false + - - true - true - true - true - @@ -123,6 +120,7 @@ + @@ -232,6 +230,7 @@ NOMINMAX;ZT_TRACE;ZT_USE_MINIUPNPC;%(PreprocessorDefinitions) + false true diff --git a/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters b/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters index b9e00b374..5a2767e4e 100644 --- a/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters +++ b/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters @@ -96,9 +96,6 @@ Source Files\osdep - - Source Files - Source Files\node @@ -192,6 +189,9 @@ Source Files\node + + Source Files\node + @@ -419,6 +419,9 @@ Header Files\node + + Header Files\node +