RFR: 8307990: jspawnhelper must close its writing side of a pipe before reading from it

Volker Simonis simonis at openjdk.org
Mon May 15 13:01:47 UTC 2023


On Sun, 14 May 2023 17:28:33 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

> Trying to understand this, and the scope of the problem:
> 
>     * Parent process opens "in" pipe.
> 
>     * Now owns read and write end of pipe.
> 
>     * Parent forks jspawnhelper.
> 
>     * jspawnhelper inherits handles. Now there are four open file descriptors to this pipe.
> 
>     * Parent dies and releases its handles
> 
>     * jspawnhelper gets thrown out of its first "readFully", but enters the next "readFully". It still owns both read and write end of the pipe. So it will wait endlessly. We only get an EOF from a pipe read when all write ends are closed.
> 
> Is this the problem? 

Exactly, except that `jspawnhelper` doesn't even gets "thrown out" of the first `readFully()` it is waiting in, as long as there's an open write end for that pipe.

> I wonder whether the parent may not have the same problem at the other end. It may be prudent to close the child's ends of the three pipes right after calling startChild() (https://github.com/openjdk/jdk/blob/020a60e6449749ca979c1ace3af7db57f4c53a5f/src/java.base/unix/native/libjava/ProcessImpl_md.c#LL681C17-L681C27).

But the parent first only reads from `fail[0]` (both, the keep-alive message as well as the EOF on a successfull `execvp()`). And it already closes its write end of that pipe before doing the first read, see:  https://github.com/openjdk/jdk/blob/020a60e6449749ca979c1ace3af7db57f4c53a5f/src/java.base/unix/native/libjava/ProcessImpl_md.c#L698

Once it made sure the child process was executed, it also closes the corresponding ends of the in/out/err pipes which connect it with the child process (see https://github.com/openjdk/jdk/blob/020a60e6449749ca979c1ace3af7db57f4c53a5f/src/java.base/unix/native/libjava/ProcessImpl_md.c#L738-L740).

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

PR Comment: https://git.openjdk.org/jdk/pull/13956#issuecomment-1547811575


More information about the core-libs-dev mailing list