From e6e98b47da42835544fc817a44c43c9896994706 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 17 Jan 2005 14:29:11 -0500 Subject: [PATCH] BUG: make sure handles are always closed even if Wait is not called. --- Source/cmWin32ProcessExecution.cxx | 83 +++++++++++++++++------------- Source/cmWin32ProcessExecution.h | 2 + 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/Source/cmWin32ProcessExecution.cxx b/Source/cmWin32ProcessExecution.cxx index 6c9b05024..78c54c205 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 822999cdf..6f6d8b77a 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);