From acb8facbbc3ae0795987bd03a3dc2c17217d6172 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 29 Mar 2014 22:14:11 +0100 Subject: [PATCH] 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. --- src/libstore/build.cc | 8 +++++--- 1 file 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) {