RFR 8067105: Socket returned by ServerSocket.accept() is inherited by child process on Windows
Chris Hegarty
chris.hegarty at oracle.com
Wed Jan 28 20:01:32 UTC 2015
Reviving an old code review [1], after further investigation…
Pertinent details from previous review:
"A socket connection which is returned by ServerSocket.accept() is
inherited by a child process. The expected behavior is that the socket
connection is not inherited by the child process. This is an oversight
in the original implementation, that only sets HANDLE_FLAG_INHERIT for
newly created sockets.
The native socket returned by ServerSocket.accept() should be configured
so it will not be inherited by a child process,
SetHandleInformation(<HANDLE>, HANDLE_FLAG_INHERIT, FALSE)."
http://cr.openjdk.java.net/~chegar/8067105/webrev.00/webrev/
—
There were on objections to the changes, since they are mainly benign, but I took the action to investigate why we are calling CreateProcess with bInheritHandles set to TRUE. It appears that, without major work, we cannot change this.
From 7147084 [2]:
Java does not provide the API to change inherit-bit for any handle. More over, since at least the JDK 6, it is assumed that all Java-created handles have no installed inherit-bit . The only handles that change the inherit-bit to 1 in the Java call are the handles of redirected Input, Output, and Error streams (IOE streams for short) for child process. That is the way these redirect the streams work. That's why we can not give up the nomination in [TRUE] the parameter [bInheritHandles] in the [CreateProcess] call. And I want to mention again that this is the only place in JDK where Java installs the inherit-bit. Java itself does not use handle inheritance.
—
Ivan pointed out that HANDLE_FLAG_INHERIT will not always work, in the case of Layered Service Providers, see [3], but it will work in the standard case.
Finally, I think that we will need to revisit the process creation implementation at some point, to see if bInheritHandles can be set to FALSE, but that is a larger, more significant, piece of work, that should be done separately.
-Chris.
P.S. if there are no objections to the changes I will amend an existing test case to cover these new cases.
[1] http://mail.openjdk.java.net/pipermail/net-dev/2014-December/008789.html
[2] https://bugs.openjdk.java.net/browse/JDK-7147084?focusedCommentId=13322689&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13322689
[3] http://stackoverflow.com/questions/12058911/can-tcp-socket-handles-be-set-not-inheritable
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/net-dev/attachments/20150128/438c5f47/attachment.html>
More information about the net-dev
mailing list