Make all popen(3) file descriptors O_CLOEXEC.
POSIX says "The popen() function shall ensure that any streams from
previous popen() calls that remain open in the parent process are closed
in the new child process". It doesn't appear to disallow all popen(3) file
descriptors from being O_CLOEXEC, and it's not obvious why anyone would want
them inherited. Let's see if we can make the stricter guarantee...
Bug: N/A
Test: ran tests
Change-Id: I2c85170d730b211637afb8ba10df150ca3237262
diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp
index 050157b..71fdd27 100644
--- a/libc/stdio/stdio.cpp
+++ b/libc/stdio/stdio.cpp
@@ -1178,8 +1178,6 @@
}
FILE* popen(const char* cmd, const char* mode) {
- bool close_on_exec = (strchr(mode, 'e') != nullptr);
-
// Was the request for a socketpair or just a pipe?
int fds[2];
bool bidirectional = false;
@@ -1231,8 +1229,6 @@
FILE* fp = fdopen(fds[parent], mode);
if (fp == nullptr) return __popen_fail(fds);
- // The caller didn't ask for their pipe to be O_CLOEXEC, so flip it back now the child has forked.
- if (!close_on_exec) fcntl(fds[parent], F_SETFD, 0);
close(fds[child]);
_EXT(fp)->_popen_pid = pid;