summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2005-01-17 19:29:11 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2005-01-17 19:29:11 (GMT)
commite6e98b47da42835544fc817a44c43c9896994706 (patch)
tree6d0df0e96e897d5c93fa62d4eda10f4d978f25bb
parent5573da922f2354e6f8b098c04238b16a11cf9f03 (diff)
downloadCMake-e6e98b47da42835544fc817a44c43c9896994706.zip
CMake-e6e98b47da42835544fc817a44c43c9896994706.tar.gz
CMake-e6e98b47da42835544fc817a44c43c9896994706.tar.bz2
BUG: make sure handles are always closed even if Wait is not called.
-rw-r--r--Source/cmWin32ProcessExecution.cxx83
-rw-r--r--Source/cmWin32ProcessExecution.h2
2 files changed, 50 insertions, 35 deletions
diff --git a/Source/cmWin32ProcessExecution.cxx b/Source/cmWin32ProcessExecution.cxx
index 6c9b050..78c54c2 100644
--- a/Source/cmWin32ProcessExecution.cxx
+++ b/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;
}
diff --git a/Source/cmWin32ProcessExecution.h b/Source/cmWin32ProcessExecution.h
index 822999c..6f6d8b7 100644
--- a/Source/cmWin32ProcessExecution.h
+++ b/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);