Message340326
> ktrace shows that dup(0) succeeded but fstat(0) failed.
Aha, the problem is still the is_valid_fd() function:
/* Prefer dup() over fstat(). fstat() can require input/output whereas
dup() doesn't, there is a low risk of EMFILE/ENFILE at Python
startup. */
The function has been fixed on macOS with:
#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
I see two options:
* Only use dup() on platforms when we know that dup() is enough to detect corner cases: Linux and Windows
* Force usage of fstat() on FreeBSD... But what about OpenBSD, NetBSD and other BSD variants?
I wrote attached PR 12852 to only use dup() on Linux and Windows. |
|
Date |
User |
Action |
Args |
2019-04-16 09:56:57 | vstinner | set | recipients:
+ vstinner, koobs, izbyshev, rudolphf, Владислав Ярмак |
2019-04-16 09:56:57 | vstinner | set | messageid: <1555408617.37.0.939198878646.issue32849@roundup.psfhosted.org> |
2019-04-16 09:56:57 | vstinner | link | issue32849 messages |
2019-04-16 09:56:57 | vstinner | create | |
|