RFR: 8289643: File descriptor leak with ProcessBuilder.startPipeline

Roger Riggs rriggs at openjdk.org
Thu Jul 7 19:17:29 UTC 2022


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


More information about the core-libs-dev mailing list