From d098a99d098851f515dd536ed08baad06e484d63 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 31 Jul 2020 11:42:03 -0700 Subject: [PATCH] fix memory init issue and another place where dns data needs to be copied --- .gitignore | 1 + node/DNS.hpp | 1 + node/Network.cpp | 6 ++++++ osdep/EthernetTap.hpp | 1 + osdep/MacEthernetTap.cpp | 5 +++++ osdep/MacEthernetTap.hpp | 1 + osdep/MacKextEthernetTap.cpp | 5 +++++ osdep/MacKextEthernetTap.hpp | 2 ++ service/OneService.cpp | 29 +++++++++++++++++++++++++---- 9 files changed, 47 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 62a6c6a17..584bdb6c1 100755 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,4 @@ __pycache__ attic/world/*.c25519 attic/world/mkworld workspace/ +workspace2/ diff --git a/node/DNS.hpp b/node/DNS.hpp index ff685d32d..a770859d8 100644 --- a/node/DNS.hpp +++ b/node/DNS.hpp @@ -43,6 +43,7 @@ public: template static inline void deserializeDNS(const Buffer &b, unsigned int &p, ZT_VirtualNetworkDNS *dns, const unsigned int dnsCount) { + memset(dns, 0, sizeof(ZT_VirtualNetworkDNS)*ZT_MAX_NETWORK_DNS); for(unsigned int i = 0; i < dnsCount; ++i) { char *d = (char*)b.data()+p; memcpy(dns[i].domain, d, 128); diff --git a/node/Network.cpp b/node/Network.cpp index cfdbb3764..76b322af6 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -586,6 +586,7 @@ Network::Network(const RuntimeEnvironment *renv,void *tPtr,uint64_t nwid,void *u if (!_portInitialized) { ZT_VirtualNetworkConfig ctmp; + memset(&ctmp, 0, sizeof(ZT_VirtualNetworkConfig)); _externalConfig(&ctmp); _portError = RR->node->configureVirtualNetworkPort(tPtr,_id,&_uPtr,ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP,&ctmp); _portInitialized = true; @@ -1426,6 +1427,11 @@ void Network::_externalConfig(ZT_VirtualNetworkConfig *ec) const ec->multicastSubscriptions[i].mac = _myMulticastGroups[i].mac().toInt(); ec->multicastSubscriptions[i].adi = _myMulticastGroups[i].adi(); } + + ec->dnsCount = _config.dnsCount; + if (ec->dnsCount > 0) { + memcpy(&ec->dns, &_config.dns, sizeof(ZT_VirtualNetworkDNS)); + } } void Network::_sendUpdatesToMembers(void *tPtr,const MulticastGroup *const newMulticastGroup) diff --git a/osdep/EthernetTap.hpp b/osdep/EthernetTap.hpp index db52e6b43..d8de16886 100644 --- a/osdep/EthernetTap.hpp +++ b/osdep/EthernetTap.hpp @@ -53,6 +53,7 @@ public: virtual void setFriendlyName(const char *friendlyName) = 0; virtual void scanMulticastGroups(std::vector &added,std::vector &removed) = 0; virtual void setMtu(unsigned int mtu) = 0; + virtual void setDns(const char *domain, const std::vector &servers) = 0; }; } // namespace ZeroTier diff --git a/osdep/MacEthernetTap.cpp b/osdep/MacEthernetTap.cpp index 028f85568..3db0b3ff7 100644 --- a/osdep/MacEthernetTap.cpp +++ b/osdep/MacEthernetTap.cpp @@ -452,6 +452,11 @@ void MacEthernetTap::threadMain() } } +void MacEthernetTap::setDns(const char *domain, const std::vector &servers) +{ + +} + } // namespace ZeroTier #endif // __APPLE__ diff --git a/osdep/MacEthernetTap.hpp b/osdep/MacEthernetTap.hpp index 6d5ce8941..7945bb408 100644 --- a/osdep/MacEthernetTap.hpp +++ b/osdep/MacEthernetTap.hpp @@ -56,6 +56,7 @@ public: virtual void setFriendlyName(const char *friendlyName); virtual void scanMulticastGroups(std::vector &added,std::vector &removed); virtual void setMtu(unsigned int mtu); + virtual void setDns(const char *domain, const std::vector &servers); void threadMain() throw(); diff --git a/osdep/MacKextEthernetTap.cpp b/osdep/MacKextEthernetTap.cpp index 2325d5943..a04c2ac9b 100644 --- a/osdep/MacKextEthernetTap.cpp +++ b/osdep/MacKextEthernetTap.cpp @@ -687,4 +687,9 @@ void MacKextEthernetTap::threadMain() } } +void MacKextEthernetTap::setDns(const char *domain, const std::vector &servers) +{ + +} + } // namespace ZeroTier diff --git a/osdep/MacKextEthernetTap.hpp b/osdep/MacKextEthernetTap.hpp index f1a6f36fd..d7ea53028 100644 --- a/osdep/MacKextEthernetTap.hpp +++ b/osdep/MacKextEthernetTap.hpp @@ -56,6 +56,8 @@ public: virtual void setFriendlyName(const char *friendlyName); virtual void scanMulticastGroups(std::vector &added,std::vector &removed); virtual void setMtu(unsigned int mtu); + virtual void setDns(const char *domain, const std::vector &servers); + void threadMain() throw(); diff --git a/service/OneService.cpp b/service/OneService.cpp index c5d8076d4..ff8c37c95 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -501,6 +501,7 @@ public: settings.allowManaged = true; settings.allowGlobal = false; settings.allowDefault = false; + memset(&config, 0, sizeof(ZT_VirtualNetworkConfig)); } std::shared_ptr tap; @@ -831,7 +832,7 @@ public: Mutex::Lock _l(_nets_m); for(std::map::iterator n(_nets.begin());n!=_nets.end();++n) { if (n->second.tap) - syncManagedStuff(n->second,false,true); + syncManagedStuff(n->second,false,true,false); } } } @@ -1117,7 +1118,7 @@ public: } if (n->second.tap) - syncManagedStuff(n->second,true,true); + syncManagedStuff(n->second,true,true,true); return true; } @@ -1864,7 +1865,7 @@ public: } // Apply or update managed IPs for a configured network (be sure n.tap exists) - void syncManagedStuff(NetworkState &n,bool syncIps,bool syncRoutes) + void syncManagedStuff(NetworkState &n,bool syncIps,bool syncRoutes, bool syncDns) { char ipbuf[64]; @@ -1984,6 +1985,26 @@ public: #endif } } + + if (syncDns) { + char buf[128]; + if (n.config.dnsCount > ZT_MAX_NETWORK_DNS) { + fprintf(stderr, "ERROR: %d records > max %d. Skipping DNS\n", n.config.dnsCount, ZT_MAX_NETWORK_DNS); + return; + } + fprintf(stderr, "Syncing %d DNS configurations\n", n.config.dnsCount); + for (int i = 0; i < n.config.dnsCount; ++i) { + if (strlen(n.config.dns[i].domain) != 0) { + fprintf(stderr, "Syncing DNS for domain: %s\n", n.config.dns[i].domain); + for (int j = 0; j < ZT_MAX_DNS_SERVERS; ++j) { + InetAddress a(n.config.dns[i].server_addr[j]); + if (a.isV4() || a.isV6()) { + fprintf(stderr, "\t Server %d: %s\n", j+1, a.toIpString(buf)); + } + } + } + } + } } // ========================================================================= @@ -2333,7 +2354,7 @@ public: Sleep(10); } #endif - syncManagedStuff(n,true,true); + syncManagedStuff(n,true,true,true); n.tap->setMtu(nwc->mtu); } else { _nets.erase(nwid);