Empty passwords are valid but we won't allow them in the GUI.\r
*/\r
TCHAR *username = 0;\r
+ TCHAR *canon = 0;\r
TCHAR *password = 0;\r
if (service->usernamelen) {\r
username = service->username;\r
+ if (canonicalise_username(username, &canon)) return 5;\r
if (service->passwordlen) password = service->password;\r
- else password = _T("");\r
}\r
- else if (editing) username = NSSM_LOCALSYSTEM_ACCOUNT;\r
+ else if (editing) username = canon = NSSM_LOCALSYSTEM_ACCOUNT;\r
\r
- if (well_known_username(username)) password = _T("");\r
+ if (well_known_username(canon)) password = _T("");\r
else {\r
- if (grant_logon_as_service(username)) {\r
+ if (grant_logon_as_service(canon)) {\r
+ if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
print_message(stderr, NSSM_MESSAGE_GRANT_LOGON_AS_SERVICE_FAILED, username);\r
return 5;\r
}\r
TCHAR *dependencies = _T("");\r
if (service->dependencieslen) dependencies = 0; /* Change later. */\r
\r
- if (! ChangeServiceConfig(service->handle, service->type, startup, SERVICE_NO_CHANGE, 0, 0, 0, dependencies, username, password, service->displayname)) {\r
+ if (! ChangeServiceConfig(service->handle, service->type, startup, SERVICE_NO_CHANGE, 0, 0, 0, dependencies, canon, password, service->displayname)) {\r
+ if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
print_message(stderr, NSSM_MESSAGE_CHANGESERVICECONFIG_FAILED, error_string(GetLastError()));\r
return 5;\r
}\r
+ if (canon != username) HeapFree(GetProcessHeap(), 0, canon);\r
\r
if (service->dependencieslen) {\r
if (set_service_dependencies(service->name, service->handle, service->dependencies)) return 5;\r
unsigned long error = GetLastError();\r
log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPROCESS_FAILED, service->name, service->exe, error_string(error), 0);\r
close_output_handles(&si);\r
- duplicate_environment(service->initial_env);\r
+ duplicate_environment_strings(service->initial_env);\r
return stop_service(service, exitcode, true, true);\r
}\r
service->process_handle = pi.hProcess;\r
if (! service->no_console) FreeConsole();\r
\r
/* Restore our environment. */\r
- duplicate_environment(service->initial_env);\r
+ duplicate_environment_strings(service->initial_env);\r
\r
if (service->affinity) {\r
/*\r