The `ProcessBuilder.pipelineStart()` implementation does not close all of the 
file descriptors it uses to create the pipeline of processes.

The process calling `pipelineStart()` is creating the pipes between the stages.
As each process is launched, the file descriptor is inherited by the child 
process and
the child process `dup`s them to the respective stdin/stdout/stderr fd.  
These copies of inherited file descriptors are handled correctly.

Between the launching of each Process, the file descriptor for the read-side of 
the pipe for the output of the previous process is kept open (in the parent 
process invoking `pipelineStart`).  The file descriptor is correctly passed to 
the child and is dup'd to the stdin of the next process.

However, the open file descriptor in the parent is not closed after it has been 
used as the input for the next Process. 
The fix is to close the fd after it has been used as the input of the next 
process.

A new test verifies that after `pipelineStart` is complete, the same file 
descriptors are open for Unix Pipes as before the test.
The test only runs on Linux using the /proc/<pid>/fd filesystem to identify 
open file descriptors.

The bug fix is in `ProcessBuilder.pipelineStart` and is applicable to all 
platforms.

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

Commit messages:
 - 8289643: File descriptor leak with ProcessBuilder.startPipeline

Changes: https://git.openjdk.org/jdk/pull/9414/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9414&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8289643
  Stats: 144 lines in 2 files changed: 144 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/9414.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9414/head:pull/9414

PR: https://git.openjdk.org/jdk/pull/9414

Reply via email to