RFR: 8366736: Closed System.out causes child process to hang on Windows
Ioi Lam
iklam at openjdk.org
Tue Jan 13 18:33:29 UTC 2026
The bug is here on line 121:
https://github.com/openjdk/jdk/blob/586846b84a38d285c5905437e903cfc57f609410/src/java.base/windows/classes/java/lang/ProcessImpl.java#L118-L121
If `System.out` has been closed, `fdAccess.getHandle()` will return -1. This causes `stdHandles[1]` to have the same value as if the child process's stdout was redirected with `Redirect.PIPE`. This will cause a Pipe to be created here for the child process's STDOUT on line 168:
https://github.com/openjdk/jdk/blob/586846b84a38d285c5905437e903cfc57f609410/src/java.base/windows/native/libjava/ProcessImpl_md.c#L158-L184
However, the caller of the `ProcessBuilder` is not aware of this and will not drain this pipe. This causes the child process to get stuck when writing to its stdout when the pipe 's buffer is filled up.
The fix is to treat the redirection as `Redirect.DISCARD` when `System.out` and/or `System.err` have been closed.
-------------
Commit messages:
- 8366736: Closed System.out causes child process to hang on Windows
Changes: https://git.openjdk.org/jdk/pull/29198/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29198&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8366736
Stats: 105 lines in 2 files changed: 100 ins; 0 del; 5 mod
Patch: https://git.openjdk.org/jdk/pull/29198.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/29198/head:pull/29198
PR: https://git.openjdk.org/jdk/pull/29198
More information about the core-libs-dev
mailing list