summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/EthernetTap.cpp2
-rw-r--r--node/Node.cpp10
-rw-r--r--node/Topology.cpp10
-rw-r--r--node/Utils.cpp15
4 files changed, 24 insertions, 13 deletions
diff --git a/node/EthernetTap.cpp b/node/EthernetTap.cpp
index 87482537..fce30b61 100644
--- a/node/EthernetTap.cpp
+++ b/node/EthernetTap.cpp
@@ -1465,7 +1465,7 @@ void EthernetTap::threadMain()
for(;;) {
if (!_run) break;
- WaitForMultipleObjectsEx(3,wait4,FALSE,INFINITE,TRUE);
+ DWORD r = WaitForMultipleObjectsEx(writeInProgress ? 3 : 2,wait4,FALSE,INFINITE,TRUE);
if (!_run) break;
if (HasOverlappedIoCompleted(&_tapOvlRead)) {
diff --git a/node/Node.cpp b/node/Node.cpp
index d195b9f1..e55cad04 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -419,12 +419,16 @@ Node::ReasonForTermination Node::run()
}
Utils::lockDownFile(identitySecretPath.c_str(),false);
- // Make sure networks.d exists
+ // Make sure networks.d exists and is secure
+ {
+ std::string networksDotD(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d");
#ifdef __WINDOWS__
- CreateDirectoryA((_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d").c_str(),NULL);
+ CreateDirectoryA(networksDotD.c_str(),NULL);
#else
- mkdir((_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d").c_str(),0700);
+ mkdir(networksDotD.c_str(),0700);
#endif
+ Utils::lockDownFile(networksDotD.c_str(),true);
+ }
// Load or generate config authentication secret
std::string configAuthTokenPath(_r->homePath + ZT_PATH_SEPARATOR_S + "authtoken.secret");
diff --git a/node/Topology.cpp b/node/Topology.cpp
index 6efde33e..b499063c 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -280,17 +280,13 @@ void Topology::_loadPeers()
buf.setSize(buf.size() - ptr);
}
} while (rlen > 0);
- fclose(pd);
- } else {
- fclose(pd);
- Utils::rm(pdpath);
}
} catch ( ... ) {
- // Membership cert dump file invalid. We'll re-learn them off the net.
_activePeers.clear();
- fclose(pd);
- Utils::rm(pdpath);
}
+
+ fclose(pd);
+ Utils::rm(pdpath);
}
} // namespace ZeroTier
diff --git a/node/Utils.cpp b/node/Utils.cpp
index 53a67179..e91cb6a1 100644
--- a/node/Utils.cpp
+++ b/node/Utils.cpp
@@ -251,8 +251,19 @@ void Utils::lockDownFile(const char *path,bool isDir)
#ifdef __UNIX_LIKE__
chmod(path,isDir ? 0700 : 0600);
#else
-#ifdef _WIN32
- // TODO: windows ACL hell...
+#ifdef __WINDOWS__
+ {
+ STARTUPINFOA startupInfo;
+ startupInfo.cb = sizeof(startupInfo);
+ PROCESS_INFORMATION processInfo;
+ memset(&startupInfo,0,sizeof(STARTUPINFOA));
+ memset(&processInfo,0,sizeof(PROCESS_INFORMATION));
+ if (CreateProcessA(NULL,(LPSTR)(std::string("C:\\Windows\\System32\\cacls.exe \"") + path + "\" /E /R Users").c_str(),NULL,NULL,FALSE,0,NULL,NULL,&startupInfo,&processInfo)) {
+ WaitForSingleObject(processInfo.hProcess,INFINITE);
+ CloseHandle(processInfo.hProcess);
+ CloseHandle(processInfo.hThread);
+ }
+ }
#endif
#endif
}