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

View file

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