فهرست منبع

Ensure we have a valid service exit time.

Sometimes GetProcessTimes() will succeed but return 0 for the process
exit time, leading check_parent() to conclude that the service had
exited before a child process had started, and thus that the child
process was not part of the service's tree.

We now use initialise the service exit time to the current time before
attempting to get the real exit time, and only override the value if
it's valid.

Thanks Czenda Czendov.
Iain Patterson 10 سال پیش
والد
کامیت
8663869ce7
2فایلهای تغییر یافته به همراه6 افزوده شده و 2 حذف شده
  1. 1 0
      process.cpp
  2. 5 2
      service.cpp

+ 1 - 0
process.cpp

@@ -23,6 +23,7 @@ int get_process_exit_time(HANDLE process_handle, FILETIME *ft) {
     return 1;
   }
 
+  if (! (exit_time.dwLowDateTime || exit_time.dwHighDateTime)) return 2;
   memmove(ft, &exit_time, sizeof(exit_time));
 
   return 0;

+ 5 - 2
service.cpp

@@ -1680,15 +1680,18 @@ void CALLBACK end_service(void *arg, unsigned char why) {
 
   service->rotate_stdout_online = service->rotate_stderr_online = NSSM_ROTATE_OFFLINE;
 
+  /* Use now as a dummy exit time. */
+  GetSystemTimeAsFileTime(&service->exit_time);
+
   /* Check exit code */
   unsigned long exitcode = 0;
   TCHAR code[16];
   if (service->process_handle) {
     GetExitCodeProcess(service->process_handle, &exitcode);
-    if (exitcode == STILL_ACTIVE || get_process_exit_time(service->process_handle, &service->exit_time)) GetSystemTimeAsFileTime(&service->exit_time);
+    /* Check real exit time. */
+    if (exitcode != STILL_ACTIVE) get_process_exit_time(service->process_handle, &service->exit_time);
     CloseHandle(service->process_handle);
   }
-  else GetSystemTimeAsFileTime(&service->exit_time);
 
   service->process_handle = 0;