On Mon, 19 Jan 2026 21:47:26 GMT, Ioi Lam <[email protected]> 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:
> 
>   Fixed typo

The APINote will trigger need for a CSR.

src/java.base/share/classes/java/lang/ProcessBuilder.java line 936:

> 934:      * If {#code System.out} and/or {#code System.err} have been
> 935:      * closed in the current process, the corresponding output
> 936:      * in the subprocess will be discarded.

Suggestion:

     * When the process is {@link #start started}, 
     * if {#code System.out} and/or {#code System.err} have been
     * closed in the current process, the corresponding output
     * in the subprocess will be discarded.

Qualified to apply at the time the process is started, not when 
ProcessBuilder.inheritIO is called.

-------------

PR Review: https://git.openjdk.org/jdk/pull/29198#pullrequestreview-3708036042
PR Review Comment: https://git.openjdk.org/jdk/pull/29198#discussion_r2729282389

Reply via email to