diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-03-29 22:14:11 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-03-29 22:14:11 +0100 |
commit | acb8facbbc3ae0795987bd03a3dc2c17217d6172 (patch) | |
tree | 4eb0509df531dd1c73c16e9099aedd2aeab45d03 | |
parent | 90dc50b07c3939dda44fde79f696f64bf8f2f4d7 (diff) |
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.
-rw-r--r-- | src/libstore/build.cc | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 5a869ead6..5c3307507 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -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) { |