diff --git a/node/Bond.cpp b/node/Bond.cpp index 5ab164bb5..23c309acf 100644 --- a/node/Bond.cpp +++ b/node/Bond.cpp @@ -1374,14 +1374,13 @@ void Bond::processBalanceTasks(int64_t now) Mutex::Lock _l(_flows_m); std::map >::iterator flow_it = _flows.begin(); while (flow_it != _flows.end()) { - if (! _paths[flow_it->second->assignedPath].p) { - continue; - } - int originalPathIdx = flow_it->second->assignedPath; - if (! _paths[originalPathIdx].eligible) { - log("moving all flows from dead link %s", pathToStr(_paths[originalPathIdx].p).c_str()); - if (assignFlowToBondedPath(flow_it->second, now, true)) { - _paths[originalPathIdx].assignedFlowCount--; + if (_paths[flow_it->second->assignedPath].p) { + int originalPathIdx = flow_it->second->assignedPath; + if (! _paths[originalPathIdx].eligible) { + log("moving all flows from dead link %s", pathToStr(_paths[originalPathIdx].p).c_str()); + if (assignFlowToBondedPath(flow_it->second, now, true)) { + _paths[originalPathIdx].assignedFlowCount--; + } } } ++flow_it; @@ -1394,14 +1393,13 @@ void Bond::processBalanceTasks(int64_t now) Mutex::Lock _l(_flows_m); std::map >::iterator flow_it = _flows.begin(); while (flow_it != _flows.end()) { - if (! _paths[flow_it->second->assignedPath].p) { - continue; - } - int originalPathIdx = flow_it->second->assignedPath; - if (_paths[originalPathIdx].shouldAvoid) { - if (assignFlowToBondedPath(flow_it->second, now, true)) { - _paths[originalPathIdx].assignedFlowCount--; - return; // Only move one flow at a time + if (_paths[flow_it->second->assignedPath].p) { + int originalPathIdx = flow_it->second->assignedPath; + if (_paths[originalPathIdx].shouldAvoid) { + if (assignFlowToBondedPath(flow_it->second, now, true)) { + _paths[originalPathIdx].assignedFlowCount--; + return; // Only move one flow at a time + } } } ++flow_it; diff --git a/windows/ZeroTierOne/ServiceInstaller.cpp b/windows/ZeroTierOne/ServiceInstaller.cpp index 05a78002e..39a0519f8 100644 --- a/windows/ZeroTierOne/ServiceInstaller.cpp +++ b/windows/ZeroTierOne/ServiceInstaller.cpp @@ -49,28 +49,34 @@ std::string InstallService(PSTR pszServiceName, PSTR pszAccount, PSTR pszPassword) { - std::string ret; - char szPathTmp[MAX_PATH],szPath[MAX_PATH]; + std::string ret; + std::string path(0x7FFF, '\0'); + SC_HANDLE schSCManager = NULL; SC_HANDLE schService = NULL; SERVICE_DESCRIPTION sd; LPTSTR szDesc = TEXT("ZeroTier network virtualization service."); - if (GetModuleFileName(NULL, szPathTmp, ARRAYSIZE(szPath)) == 0) + DWORD dwCharacters = GetModuleFileName(NULL, path.data(), path.size()); + + if (dwCharacters == 0) { - ret = "GetModuleFileName failed, unable to get path to self"; + ret = "GetModuleFileName failed, unable to get path to self"; goto Cleanup; } - // Quote path in case it contains spaces - _snprintf_s(szPath,sizeof(szPath),"\"%s\"",szPathTmp); + // Trim excess nulls which the returned size does not include + path.resize(dwCharacters); + + // Quote path in case it contains spaces + path = '"' + path + '"'; // Open the local default service control manager database schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE); if (schSCManager == NULL) { - ret = "OpenSCManager failed"; + ret = "OpenSCManager failed"; goto Cleanup; } @@ -83,7 +89,7 @@ std::string InstallService(PSTR pszServiceName, SERVICE_WIN32_OWN_PROCESS, // Service type dwStartType, // Service start type SERVICE_ERROR_NORMAL, // Error control type - szPath, // Service's binary + path.c_str(), // Service's binary NULL, // No load ordering group NULL, // No tag identifier pszDependencies, // Dependencies @@ -92,7 +98,7 @@ std::string InstallService(PSTR pszServiceName, ); if (schService == NULL) { - ret = "CreateService failed"; + ret = "CreateService failed"; goto Cleanup; } @@ -112,7 +118,7 @@ Cleanup: schService = NULL; } - return ret; + return ret; }