about summary refs log tree commit diff
path: root/src/libstore/build.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-29T21·14+0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-29T21·14+0100
commitacb8facbbc3ae0795987bd03a3dc2c17217d6172 (patch)
tree4eb0509df531dd1c73c16e9099aedd2aeab45d03 /src/libstore/build.cc
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/libstore/build.cc')
-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 5a869ead61..5c3307507a 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)
         {