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

This commit is contained in:
Bill Hoffman 2005-01-17 14:29:11 -05:00
parent 5573da922f
commit e6e98b47da
2 changed files with 50 additions and 35 deletions

View File

@ -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;
}

View File

@ -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);