Skip to content

Fix GH-25204: False EOF on an idle pipe on Windows - #25206

Open
lazerg wants to merge 1 commit into
php:PHP-8.4from
lazerg:fix/gh-25204-windows-pipe-false-eof
Open

lazerg wants to merge 1 commit into
php:PHP-8.4from
lazerg:fix/gh-25204-windows-pipe-false-eof

Conversation

@lazerg

@lazerg lazerg commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

On Windows, php_stdiop_read() polls a non-blocking pipe with PeekNamedPipe() and usleep(10) for a bounded number of rounds. When that wait runs out on a pipe that is still open, count drops to 0, read() returns 0 and the stream gets marked as EOF. Since usleep(10) is ~15ms on Windows, this hits a silent STDIN after about 13.5 hours and the CLI process just ends.

Now a wait that runs out while PeekNamedPipe() still succeeds returns 0 without setting eof, so the read still comes back empty but feof() stays false. A broken pipe still makes PeekNamedPipe() fail and ends in EOF as before. This is the change suggested in the issue. No test, since it would need to wait out the full loop.

Fixes #25204

@lazerg
lazerg requested a review from bukka as a code owner November 5, 2026 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant