[Support] Fix handle and memory leak for processes that are not waited for

Execute's Data parameter is now optional, so we won't allocate memory
for it on Windows and we'll close the process handle.

The Unix code should probably do something similar to avoid accumulation
of zombie children that haven't been waited on.

Tested on Linux and Windows.

llvm-svn: 183906
diff --git a/llvm/lib/Support/Program.cpp b/llvm/lib/Support/Program.cpp
index 6e04a1c..b1a9b98 100644
--- a/llvm/lib/Support/Program.cpp
+++ b/llvm/lib/Support/Program.cpp
@@ -22,7 +22,7 @@
 //===          independent code.
 //===----------------------------------------------------------------------===//
 
-static bool Execute(void *&Data, const Path &path, const char **args,
+static bool Execute(void **Data, const Path &path, const char **args,
                     const char **env, const sys::Path **redirects,
                     unsigned memoryLimit, std::string *ErrMsg);
 
@@ -34,7 +34,7 @@
                         unsigned memoryLimit, std::string *ErrMsg,
                         bool *ExecutionFailed) {
   void *Data = 0;
-  if (Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg)) {
+  if (Execute(&Data, path, args, envp, redirects, memoryLimit, ErrMsg)) {
     if (ExecutionFailed) *ExecutionFailed = false;
     return Wait(Data, path, secondsToWait, ErrMsg);
   }
@@ -45,8 +45,7 @@
 void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp,
                         const Path **redirects, unsigned memoryLimit,
                         std::string *ErrMsg) {
-  void *Data = 0;
-  Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg);
+  Execute(/*Data*/ 0, path, args, envp, redirects, memoryLimit, ErrMsg);
 }
 
 // Include the platform-specific parts of this class.
diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc
index 0d6543a..d8bdd6c 100644
--- a/llvm/lib/Support/Unix/Program.inc
+++ b/llvm/lib/Support/Unix/Program.inc
@@ -178,7 +178,7 @@
 
 }
 
-static bool Execute(void *&Data, const Path &path, const char **args,
+static bool Execute(void **Data, const Path &path, const char **args,
                     const char **envp, const Path **redirects,
                     unsigned memoryLimit, std::string *ErrMsg) {
   // If this OS has posix_spawn and there is no memory limit being implied, use
@@ -228,7 +228,8 @@
     if (Err)
      return !MakeErrMsg(ErrMsg, "posix_spawn failed", Err);
 
-    Data = reinterpret_cast<void*>(PID);
+    if (Data)
+      *Data = reinterpret_cast<void*>(PID);
     return true;
   }
 #endif
@@ -290,7 +291,8 @@
       break;
   }
 
-  Data = reinterpret_cast<void*>(child);
+  if (Data)
+    *Data = reinterpret_cast<void*>(child);
 
   return true;
 }
@@ -299,11 +301,7 @@
                 std::string *ErrMsg) {
 #ifdef HAVE_SYS_WAIT_H
   struct sigaction Act, Old;
-
-  if (Data == 0) {
-    MakeErrMsg(ErrMsg, "Process not started!");
-    return -1;
-  }
+  assert(Data && "invalid pid to wait on, process not started?");
 
   // Install a timeout handler.  The handler itself does nothing, but the simple
   // fact of having a handler at all causes the wait below to return with EINTR,
diff --git a/llvm/lib/Support/Windows/Program.inc b/llvm/lib/Support/Windows/Program.inc
index 0e8bbc8..90a5cdb 100644
--- a/llvm/lib/Support/Windows/Program.inc
+++ b/llvm/lib/Support/Windows/Program.inc
@@ -170,20 +170,13 @@
 
 }
 
-static bool Execute(void *&Data,
+static bool Execute(void **Data,
                     const Path& path,
                     const char** args,
                     const char** envp,
                     const Path** redirects,
                     unsigned memoryLimit,
                     std::string* ErrMsg) {
-  if (Data) {
-    Win32ProcessInfo* wpi = reinterpret_cast<Win32ProcessInfo*>(Data);
-    CloseHandle(wpi->hProcess);
-    delete wpi;
-    Data = 0;
-  }
-
   if (!path.canExecute()) {
     if (ErrMsg)
       *ErrMsg = "program not executable";
@@ -321,10 +314,12 @@
                path.str() + "'");
     return false;
   }
-  Win32ProcessInfo* wpi = new Win32ProcessInfo;
-  wpi->hProcess = pi.hProcess;
-  wpi->dwProcessId = pi.dwProcessId;
-  Data = wpi;
+  if (Data) {
+    Win32ProcessInfo* wpi = new Win32ProcessInfo;
+    wpi->hProcess = pi.hProcess;
+    wpi->dwProcessId = pi.dwProcessId;
+    *Data = wpi;
+  }
 
   // Make sure these get closed no matter what.
   ScopedCommonHandle hThread(pi.hThread);
@@ -354,21 +349,17 @@
     }
   }
 
+  // Don't leak the handle if the caller doesn't want it.
+  if (!Data)
+    CloseHandle(pi.hProcess);
+
   return true;
 }
 
-static int WaitAux(void *&Data, const Path &path,
-                   unsigned secondsToWait,
-                   std::string* ErrMsg) {
-  if (Data == 0) {
-    MakeErrMsg(ErrMsg, "Process not started!");
-    return -1;
-  }
-
-  Win32ProcessInfo* wpi = reinterpret_cast<Win32ProcessInfo*>(Data);
-  HANDLE hProcess = wpi->hProcess;
-
+static int WaitAux(Win32ProcessInfo *wpi, const Path &path,
+                   unsigned secondsToWait, std::string *ErrMsg) {
   // Wait for the process to terminate.
+  HANDLE hProcess = wpi->hProcess;
   DWORD millisecondsToWait = INFINITE;
   if (secondsToWait > 0)
     millisecondsToWait = secondsToWait * 1000;
@@ -407,12 +398,11 @@
   return 1;
 }
 
-static int Wait(void *&Data, const Path &path,
-                unsigned secondsToWait,
-                std::string* ErrMsg) {
-  int Ret = WaitAux(Data, path, secondsToWait, ErrMsg);
+static int Wait(void *&Data, const Path &path, unsigned secondsToWait,
+                std::string *ErrMsg) {
+  Win32ProcessInfo *wpi = reinterpret_cast<Win32ProcessInfo *>(Data);
+  int Ret = WaitAux(wpi, path, secondsToWait, ErrMsg);
 
-  Win32ProcessInfo* wpi = reinterpret_cast<Win32ProcessInfo*>(Data);
   CloseHandle(wpi->hProcess);
   delete wpi;
   Data = 0;