mh_execm: get rid of child process in case of error, for a clean start on next request (handle rclzip crash on encrypted files)

This commit is contained in:
Jean-Francois Dockes 2010-09-23 18:32:52 +02:00
parent 74fa554067
commit e8671c83be
3 changed files with 8 additions and 1 deletions

View File

@ -172,6 +172,7 @@ bool MimeHandlerExecMultiple::next_document()
obuf << "Mimetype: " << m_mimeType.length() << "\n" << m_mimeType;
obuf << "\n";
if (m_cmd.send(obuf.str()) < 0) {
m_cmd.zapChild();
LOGERR(("MHExecMultiple: send error\n"));
return false;
}
@ -185,6 +186,7 @@ bool MimeHandlerExecMultiple::next_document()
for (int loop=0;;loop++) {
string name, data;
if (!readDataElement(name, data)) {
m_cmd.zapChild();
return false;
}
if (name.empty())

View File

@ -462,9 +462,9 @@ int ExecCmd::wait(bool haderror)
if (!m_killRequest && m_pid > 0) {
if (waitpid(m_pid, &status, 0) < 0)
status = -1;
LOGDEB(("ExecCmd::wait: got status 0x%x\n", status));
m_pid = -1;
}
LOGDEB(("ExecCmd::wait: got status 0x%x\n", status));
return haderror ? -1 : status;
}

View File

@ -147,6 +147,11 @@ class ExecCmd {
*/
void setKill() {m_killRequest = true;}
/**
* Get rid of current process (become ready for start).
*/
void zapChild() {setKill(); (void)wait();}
ExecCmd()
: m_advise(0), m_provide(0), m_timeoutMs(1000)
{