aboutsummaryrefslogtreecommitdiffstats
path: root/executor/executor.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-12-05 15:50:47 +0100
committerDmitry Vyukov <dvyukov@google.com>2016-12-05 21:07:26 +0100
commit66700b2c86dbef43c2b14800f84caa06eb9d2864 (patch)
tree4b6baa5aa9622a275a565ee3f93542e3505df9e4 /executor/executor.cc
parentce1cd11efcd29052fda2f9e6d670c286e9c5021e (diff)
executor: change the way we wait for children
waitpid(pid) does not work if child invokes ptrace(PTRACE_TRACEME): https://groups.google.com/forum/#!topic/syzkaller/SjWzOnNRRIU Use waitpid(-1) instead.
Diffstat (limited to 'executor/executor.cc')
-rw-r--r--executor/executor.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index a51bd2e46..677d2919f 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -186,7 +186,7 @@ int main(int argc, char** argv)
fail("clone failed");
debug("spawned loop pid %d\n", pid);
int status = 0;
- while (waitpid(pid, &status, __WALL) != pid) {
+ while (waitpid(-1, &status, __WALL) != pid) {
}
status = WEXITSTATUS(status);
if (status == kFailStatus)
@@ -241,7 +241,7 @@ void loop()
int status = 0;
uint64_t start = current_time_ms();
for (;;) {
- int res = waitpid(pid, &status, __WALL | WNOHANG);
+ int res = waitpid(-1, &status, __WALL | WNOHANG);
int errno0 = errno;
if (res == pid) {
debug("waitpid(%d)=%d (%d)\n", pid, res, errno0);
@@ -253,10 +253,12 @@ void loop()
debug("killing\n");
kill(-pid, SIGKILL);
kill(pid, SIGKILL);
- int res = waitpid(pid, &status, __WALL);
- debug("waitpid(%d)=%d (%d)\n", pid, res, errno);
- if (res != pid)
- fail("waitpid failed");
+ for (;;) {
+ int res = waitpid(-1, &status, __WALL);
+ debug("waitpid(%d)=%d (%d)\n", pid, res, errno);
+ if (res == pid)
+ break;
+ }
break;
}
}