From bb52198d196ba294908abad00960783456e40f8b Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Mon, 31 Oct 2011 15:39:03 -0700 Subject: [PATCH] don't leak fds into subprocesses Patch from Antoine Labour , (hacky) test by me. --- misc/inherited-fds.ninja | 23 +++++++++++++++++++++++ src/subprocess.cc | 1 + 2 files changed, 24 insertions(+) create mode 100644 misc/inherited-fds.ninja 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) -- 2.7.4