Browse Source

BUG: make sure handles are always closed even if Wait is not called.

Bill Hoffman 21 years ago
parent
commit
e6e98b47da
2 changed files with 50 additions and 35 deletions
  1. 48 35
      Source/cmWin32ProcessExecution.cxx
  2. 2 0
      Source/cmWin32ProcessExecution.h

+ 48 - 35
Source/cmWin32ProcessExecution.cxx

@@ -685,6 +685,52 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
   return true;
 }
 
+bool cmWin32ProcessExecution::CloseHandles()
+{
+  bool ret = true;
+  if (this->hChildStdinRd && !CloseHandle(this->hChildStdinRd))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStdinRd = 0;
+  if(this->hChildStdoutRdDup && !CloseHandle(this->hChildStdoutRdDup))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStdoutRdDup = 0;
+  if(this->hChildStderrRdDup && !CloseHandle(this->hChildStderrRdDup))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStderrRdDup = 0;
+  if(this->hChildStdinWrDup && !CloseHandle(this->hChildStdinWrDup))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStdinWrDup = 0;
+  if (this->hChildStdoutWr && !CloseHandle(this->hChildStdoutWr))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStdoutWr = 0;
+  if (this->hChildStderrWr && !CloseHandle(this->hChildStderrWr))
+    {
+    m_Output += "CloseHandleError\n";
+    ret = false;
+    }
+  this->hChildStderrWr = 0;
+  return ret;
+}
+cmWin32ProcessExecution::~cmWin32ProcessExecution()
+{
+  this->CloseHandles();
+}
+
 /*
  * Wrapper for fclose() to use for popen* files, so we can retrieve the
  * exit code for the child process and return as a result of the close.
@@ -806,41 +852,8 @@ bool cmWin32ProcessExecution::PrivateClose(int /* timeout */)
   CloseHandle(hProcess);
   m_ExitValue = result;
   m_Output += output;
-
-  if (this->hChildStdinRd && !CloseHandle(this->hChildStdinRd))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-  if(this->hChildStdoutRdDup && !CloseHandle(this->hChildStdoutRdDup))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-  if(this->hChildStderrRdDup && !CloseHandle(this->hChildStderrRdDup))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-  if(this->hChildStdinWrDup && !CloseHandle(this->hChildStdinWrDup))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-  if (this->hChildStdoutWr && !CloseHandle(this->hChildStdoutWr))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-          
-  if (this->hChildStderrWr && !CloseHandle(this->hChildStderrWr))
-    {
-    m_Output += "CloseHandleError\n";
-    return false;
-    }
-
-
-  if ( result < 0 )
+  bool ret = this->CloseHandles();
+  if ( result < 0 || !ret)
     {
     return false;
     }

+ 2 - 0
Source/cmWin32ProcessExecution.h

@@ -49,6 +49,7 @@ public:
     this->SetConsoleSpawn("w9xpopen.exe");
     this->Initialize();
     }
+  ~cmWin32ProcessExecution();
   ///! If true windows will be created hidden.
   void SetHideWindows(bool v) { m_HideWindows = v;  }
   
@@ -139,6 +140,7 @@ public:
                                 int timeout, bool hideWindows);
 
 private:
+  bool CloseHandles();
   bool PrivateOpen(const char*, const char*, int, int);
   bool PrivateClose(int timeout);