X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=registry.cpp;h=74fe047e287fb34d621b759ca483a5eb6f04c6f6;hb=df8b0890255d7d1eeade3ba7754ef37c61d2fbad;hp=75d48c79f74b45f851c6087332796df30990c8fb;hpb=2294db794e6dfd5698fe57d135cd0da67aca95b0;p=nssm.git diff --git a/registry.cpp b/registry.cpp index 75d48c7..74fe047 100644 --- a/registry.cpp +++ b/registry.cpp @@ -150,6 +150,7 @@ int set_environment(TCHAR *service_name, HKEY key, TCHAR *value, TCHAR **env, un /* Dummy test to find buffer size */ unsigned long ret = RegQueryValueEx(key, value, 0, &type, NULL, envlen); if (ret != ERROR_SUCCESS) { + *env = 0; *envlen = 0; /* The service probably doesn't have any environment configured */ if (ret == ERROR_FILE_NOT_FOUND) return 0; @@ -158,6 +159,8 @@ int set_environment(TCHAR *service_name, HKEY key, TCHAR *value, TCHAR **env, un } if (type != REG_MULTI_SZ) { + *env = 0; + *envlen = 0; log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_INVALID_ENVIRONMENT_STRING_TYPE, value, service_name, 0); return 2; } @@ -170,6 +173,7 @@ int set_environment(TCHAR *service_name, HKEY key, TCHAR *value, TCHAR **env, un *env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, *envlen); if (! *env) { + *envlen = 0; log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, value, _T("set_environment()"), 0); return 3; } @@ -177,10 +181,10 @@ int set_environment(TCHAR *service_name, HKEY key, TCHAR *value, TCHAR **env, un /* Actually get the strings */ ret = RegQueryValueEx(key, value, 0, &type, (unsigned char *) *env, envlen); if (ret != ERROR_SUCCESS) { - log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_QUERYVALUE_FAILED, value, error_string(GetLastError()), 0); HeapFree(GetProcessHeap(), 0, *env); *env = 0; *envlen = 0; + log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_QUERYVALUE_FAILED, value, error_string(GetLastError()), 0); return 4; } @@ -357,36 +361,38 @@ int get_parameters(nssm_service_t *service, STARTUPINFO *si) { /* Environment variables to add to existing rather than replace - may fail. */ set_environment(service->name, key, NSSM_REG_ENV_EXTRA, &service->env_extra, &service->env_extralen); - if (service->env_extra) { - /* Append these to any other environment variables set. */ - if (service->env) { - /* Append extra variables to configured variables. */ - unsigned long envlen = service->envlen + service->env_extralen - 1; - TCHAR *env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, envlen); - if (env) { - memmove(env, service->env, service->envlen - sizeof(TCHAR)); - /* envlen is in bytes. */ - memmove(env + (service->envlen / sizeof(TCHAR)) - 1, service->env_extra, service->env_extralen); - - HeapFree(GetProcessHeap(), 0, service->env); - service->env = env; - service->envlen = envlen; + if (si) { + if (service->env_extra) { + /* Append these to any other environment variables set. */ + if (service->env) { + /* Append extra variables to configured variables. */ + unsigned long envlen = service->envlen + service->env_extralen - 1; + TCHAR *env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, envlen); + if (env) { + memmove(env, service->env, service->envlen - sizeof(TCHAR)); + /* envlen is in bytes. */ + memmove(env + (service->envlen / sizeof(TCHAR)) - 1, service->env_extra, service->env_extralen); + + HeapFree(GetProcessHeap(), 0, service->env); + service->env = env; + service->envlen = envlen; + } + else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("get_parameters()"), 0); } - else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("get_parameters()"), 0); - } - else { - /* Append extra variables to our environment. */ - TCHAR *env, *s; - size_t envlen, len; - - env = service->env_extra; - len = 0; - while (*env) { - envlen = _tcslen(env) + 1; - for (s = env; *s && *s != _T('='); s++); - if (*s == _T('=')) *s++ = _T('\0'); - if (! SetEnvironmentVariable(env, s)) log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_SETENVIRONMENTVARIABLE_FAILED, env, s, error_string(GetLastError()), 0); - env += envlen; + else { + /* Append extra variables to our environment. */ + TCHAR *env, *s; + size_t envlen, len; + + env = service->env_extra; + len = 0; + while (*env) { + envlen = _tcslen(env) + 1; + for (s = env; *s && *s != _T('='); s++); + if (*s == _T('=')) *s++ = _T('\0'); + if (! SetEnvironmentVariable(env, s)) log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_SETENVIRONMENTVARIABLE_FAILED, env, s, error_string(GetLastError()), 0); + env += envlen; + } } } }