Added quote().
[nssm.git] / service.cpp
index ce3fb92..164fbc0 100644 (file)
@@ -760,7 +760,7 @@ void cleanup_nssm_service(nssm_service_t *service) {
   if (! service) return;\r
   if (service->username) HeapFree(GetProcessHeap(), 0, service->username);\r
   if (service->password) {\r
-    SecureZeroMemory(service->password, service->passwordlen);\r
+    SecureZeroMemory(service->password, service->passwordlen * sizeof(TCHAR));\r
     HeapFree(GetProcessHeap(), 0, service->password);\r
   }\r
   if (service->dependencies) HeapFree(GetProcessHeap(), 0, service->dependencies);\r
@@ -1721,15 +1721,7 @@ int start_service(nssm_service_t *service) {
   service->status.dwControlsAccepted = SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;\r
   SetServiceStatus(service->status_handle, &service->status);\r
 \r
-  /* Pre-start hook. */\r
   unsigned long control = NSSM_SERVICE_CONTROL_START;\r
-  if (nssm_hook(&hook_threads, service, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, &control, NSSM_SERVICE_STATUS_DEADLINE, false) == NSSM_HOOK_STATUS_ABORT) {\r
-    TCHAR code[16];\r
-    _sntprintf_s(code, _countof(code), _TRUNCATE, _T("%lu"), NSSM_HOOK_STATUS_ABORT);\r
-    log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_PRESTART_HOOK_ABORT, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, service->name, code, 0);\r
-    unset_service_environment(service);\r
-    return stop_service(service, 5, true, true);\r
-  }\r
 \r
   /* Did another thread receive a stop control? */\r
   if (service->allow_restart) {\r
@@ -1742,6 +1734,15 @@ int start_service(nssm_service_t *service) {
       return stop_service(service, 4, true, true);\r
     }\r
 \r
+    /* Pre-start hook. May need I/O to have been redirected already. */\r
+    if (nssm_hook(&hook_threads, service, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, &control, NSSM_SERVICE_STATUS_DEADLINE, false) == NSSM_HOOK_STATUS_ABORT) {\r
+      TCHAR code[16];\r
+      _sntprintf_s(code, _countof(code), _TRUNCATE, _T("%lu"), NSSM_HOOK_STATUS_ABORT);\r
+      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_PRESTART_HOOK_ABORT, NSSM_HOOK_EVENT_START, NSSM_HOOK_ACTION_PRE, service->name, code, 0);\r
+      unset_service_environment(service);\r
+      return stop_service(service, 5, true, true);\r
+    }\r
+\r
     /* The pre-start hook will have cleaned the environment. */\r
     set_service_environment(service);\r
 \r