mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-18 18:56:24 +00:00
Fix service installation MAX_PATH bug on Windows
- On newer Windows, a path might hold up to 32,767 characters - https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation - The previous installation did not also check for ERROR_INSUFFICIENT_BUFFER which could lead to an ill formatted path
This commit is contained in:
parent
ff670d044a
commit
378e4ea34e
@ -50,20 +50,26 @@ std::string InstallService(PSTR pszServiceName,
|
||||
PSTR pszPassword)
|
||||
{
|
||||
std::string ret;
|
||||
char szPathTmp[MAX_PATH],szPath[MAX_PATH];
|
||||
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";
|
||||
goto Cleanup;
|
||||
}
|
||||
|
||||
// Trim excess nulls which the returned size does not include
|
||||
path.resize(dwCharacters);
|
||||
|
||||
// Quote path in case it contains spaces
|
||||
_snprintf_s(szPath,sizeof(szPath),"\"%s\"",szPathTmp);
|
||||
path = '"' + path + '"';
|
||||
|
||||
// Open the local default service control manager database
|
||||
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT |
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user