RFR: 8366736: Closed System.out causes child process to hang on Windows [v2]
Roger Riggs
rriggs at openjdk.org
Wed Jan 14 14:43:44 UTC 2026
On Wed, 14 Jan 2026 03:22:33 GMT, Ioi Lam <iklam at openjdk.org> wrote:
>> 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.
>
> Ioi Lam has updated the pull request incrementally with one additional commit since the last revision:
>
> Review comments from @RogerRiggs
The change in behavior should be documented in an APINote on Process.inheritIO() to say that the output is discarded if it has been closed.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/29198#issuecomment-3749879254
More information about the core-libs-dev
mailing list