summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-05-03 22:45:56 (GMT)
committerGitHub <noreply@github.com>2017-05-03 22:45:56 (GMT)
commit1c4670ea0cc3d208121af11b9b973e6bb268e570 (patch)
tree350e988ac5ac455bf51d1e775b8a1b430eab5760 /Python
parent5f161fd86dd5bb936a1a2a13391b13b7e59ec201 (diff)
downloadcpython-1c4670ea0cc3d208121af11b9b973e6bb268e570.zip
cpython-1c4670ea0cc3d208121af11b9b973e6bb268e570.tar.gz
cpython-1c4670ea0cc3d208121af11b9b973e6bb268e570.tar.bz2
bpo-30225: Fix is_valid_fd() on macOS Tiger (#1443)
is_valid_fd() now uses fstat() instead of dup() on macOS to return 0 on a pipe when the other side of the pipe is closed. fstat() fails with EBADF in that case, whereas dup() succeed.
Diffstat (limited to 'Python')
-rw-r--r--Python/pylifecycle.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index afd4eb8..c0f41b3 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1045,6 +1045,14 @@ initsite(void)
static int
is_valid_fd(int fd)
{
+#ifdef __APPLE__
+ /* bpo-30225: On macOS Tiger, when stdout is redirected to a pipe
+ and the other side of the pipe is closed, dup(1) succeed, whereas
+ fstat(1, &st) fails with EBADF. Prefer fstat() over dup() to detect
+ such error. */
+ struct stat st;
+ return (fstat(fd, &st) == 0);
+#else
int fd2;
if (fd < 0)
return 0;
@@ -1057,6 +1065,7 @@ is_valid_fd(int fd)
close(fd2);
_Py_END_SUPPRESS_IPH
return fd2 >= 0;
+#endif
}
/* returns Py_None if the fd is not valid */