diff options
author | Evan Martin <martine@danga.com> | 2011-10-31 22:39:03 (GMT) |
---|---|---|
committer | Evan Martin <martine@danga.com> | 2011-10-31 22:39:53 (GMT) |
commit | bb52198d196ba294908abad00960783456e40f8b (patch) | |
tree | d337b9553256648609fbecde918342e654aa2543 | |
parent | a6212990930c1ca85488bada1936ce41aac34364 (diff) | |
download | Ninja-bb52198d196ba294908abad00960783456e40f8b.zip Ninja-bb52198d196ba294908abad00960783456e40f8b.tar.gz Ninja-bb52198d196ba294908abad00960783456e40f8b.tar.bz2 |
don't leak fds into subprocesses
Patch from Antoine Labour <piman@chromium.org>, (hacky) test by me.
-rw-r--r-- | misc/inherited-fds.ninja | 23 | ||||
-rw-r--r-- | src/subprocess.cc | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/misc/inherited-fds.ninja b/misc/inherited-fds.ninja new file mode 100644 index 0000000..671155e --- /dev/null +++ b/misc/inherited-fds.ninja @@ -0,0 +1,23 @@ +# This build file prints out a list of open file descriptors in +# Ninja subprocesses, to help verify we don't accidentally leak +# any. + +# Because one fd leak was in the code managing multiple subprocesses, +# this test brings up multiple subprocesses and then dumps the fd +# table of the last one. + +# Use like: ./ninja -f misc/inherited-fds.ninja + +rule sleep + command = sleep 10000 + +rule dump + command = sleep 1; ls -l /proc/self/fd; exit 1 + +build all: phony a b c d e + +build a: sleep +build b: sleep +build c: sleep +build d: sleep +build e: dump diff --git a/src/subprocess.cc b/src/subprocess.cc index 4426da0..65322a6 100644 --- a/src/subprocess.cc +++ b/src/subprocess.cc @@ -42,6 +42,7 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { if (pipe(output_pipe) < 0) Fatal("pipe: %s", strerror(errno)); fd_ = output_pipe[0]; + SetCloseOnExec(fd_); pid_ = fork(); if (pid_ < 0) |