Fix potential segfault in waitForInput()

Since the addition of build-max-log-size, a call to
handleChildOutput() can result in cancellation of a goal.  This
invalidated the "j" iterator in the waitForInput() loop, even though
it was still used afterwards.  Likewise for the maxSilentTime
handling.

Probably fixes #231.  At least it gets rid of the valgrind warnings.
This commit is contained in:
Eelco Dolstra 2014-03-29 22:14:11 +01:00
parent 90dc50b07c
commit acb8facbbc
1 changed files with 5 additions and 3 deletions

View File

@ -3229,13 +3229,14 @@ void Worker::waitForInput()
printMsg(lvlVomit, format("%1%: read %2% bytes")
% goal->getName() % rd);
string data((char *) buffer, rd);
goal->handleChildOutput(*k, data);
j->second.lastOutput = after;
goal->handleChildOutput(*k, data);
}
}
}
if (settings.maxSilentTime != 0 &&
if (goal->getExitCode() == Goal::ecBusy &&
settings.maxSilentTime != 0 &&
j->second.respectTimeouts &&
after - j->second.lastOutput >= (time_t) settings.maxSilentTime)
{
@ -3245,7 +3246,8 @@ void Worker::waitForInput()
goal->cancel(true);
}
if (settings.buildTimeout != 0 &&
else if (goal->getExitCode() == Goal::ecBusy &&
settings.buildTimeout != 0 &&
j->second.respectTimeouts &&
after - j->second.timeStarted >= (time_t) settings.buildTimeout)
{