aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-29 22:14:11 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-29 22:14:11 +0100
commitacb8facbbc3ae0795987bd03a3dc2c17217d6172 (patch)
tree4eb0509df531dd1c73c16e9099aedd2aeab45d03 /src
parent90dc50b07c3939dda44fde79f696f64bf8f2f4d7 (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.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build.cc8
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)
{