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

Reply via email to