RFR 8237858: PlainSocketImpl.socketAccept() handles EINTR incorrectly
Michael McMahon
michael.x.mcmahon at oracle.com
Tue Mar 10 17:25:28 UTC 2020
As it happens, I'm not sure that NET_Timeout is ever called with timeout
= 0.
A zero value for the socket option means block forever and there is no
support
for polling in the API.
- Michael.
On 10/03/2020 18:21, Daniel Fuchs wrote:
> Hi Vyom,
>
> Now I have second thoughts. The documentation of poll(2) says:
>
> int poll(struct pollfd *fds, nfds_t nfds, int timeout);
>
> [...]
>
> Specifying a negative value in timeout means an infinite
> timeout.
> Specifying a timeout of zero causes poll() to return
> immediately, even if no file descriptors are ready.
>
> As Michael hinted, are we sure that we are handling the
> timeout=0 case properly?
>
> Moreover, the timeout parameter is supposed to be an int.
> I'd be more satisfied if we declared an int variable e.g.
>
> int timeoutms = timeout;
>
> at about line 411, and then update it just after line 446:
>
> timeoutms = nanoTimeout / NET_NSEC_PER_MSEC
>
> What do you think?
>
> Also JDK-8179905 [1] also modified aix_close.c, solaris_close.c,
> bsd_close.c [2] - so I believe you should also fix all these places.
>
> best regards,
>
> -- daniel
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8179905
> [2] http://hg.openjdk.java.net/jdk10/jdk10/jdk/rev/cc195249c879
>
> On 10/03/2020 16:53, Vyom Tewari26 wrote:
>> Hi Daniel,
>> Thanks for review and running all tests, In past we(i am the
>> culprit) removed the "if(timeout > 0) {" condition by mistake. This
>> check is to make sure that if the timeout set only then we do all
>> other time calculation but somehow it was not very clear by reading
>> the code.
>> NET_Timeout does not tells that there is infinite(-1) timeout as
>> well, if you see the code changes I explicitly put else block to make
>> code more readable.
>> I hosted the patch to
>> cr.openjdk.net(http://cr.openjdk.java.net/~vtewari/8237858/webrev/index.html).
>> Thanks,
>> Vyom
>>
>> ----- Original message -----
>> From: Daniel Fuchs <daniel.fuchs at oracle.com>
>> To: Vyom Tewari26 <vtewar26 at in.ibm.com>, net-dev at openjdk.java.net
>> Cc:
>> Subject: [EXTERNAL] Re: RFR 8237858: PlainSocketImpl.socketAccept()
>> handles EINTR incorrectly
>> Date: Tue, Mar 10, 2020 9:07 PM
>> Hi Vyom,
>>
>> I have sent your proposed fix to our test system and observed no
>> regression. I agree your proposed changes seem to address the
>> issue adequately. However, I'd like to hear a second opinion on the
>> possible side effects of this fix, since NET_Timeout may be called
>> at many other places.
>>
>> I see that Alan has commented on
>> https://bugs.openjdk.java.net/browse/JDK-8237858
>>
>> It would be good to get his approval (or at least Michael McMahon's)
>> before pushing.
>>
>> best regards,
>>
>> -- daniel
>>
>> On 25/02/2020 16:36, Vyom Tewari26 wrote:
>> > Hi ,
>> > Please find the below fix for the
>> > issue(https://bugs.openjdk.java.net/browse/JDK-8237858 ). In
>> > "PlainSocketImpl_socketAccept" did not handle -1 timeout
>> properly.
>> > In case of -1 timeout, "PlainSocketImpl_socketAccept" calls
>> > "NET_Timeout" if it is interrupted by signal(EINTR) then in case
>> of -1
>> > timeout it returns immediately instead of looping again.
>> > Thanks,
>> > Vyom
>> > ##########################################################
>> > diff -r d6b968af8b65
>> src/java.base/linux/native/libnet/linux_close.c
>> > --- a/src/java.base/linux/native/libnet/linux_close.c Mon
>> Feb 24
>> > 23:44:29 2020 -0500
>> > +++ b/src/java.base/linux/native/libnet/linux_close.c Tue
>> Feb 25
>> > 19:06:11 2020 +0530
>> > @@ -437,12 +437,16 @@
>> > * has expired return 0 (indicating timeout expired).
>> > */
>> > if (rv < 0 && errno == EINTR) {
>> > - jlong newNanoTime = JVM_NanoTime(env, 0);
>> > - nanoTimeout -= newNanoTime - prevNanoTime;
>> > - if (nanoTimeout < NET_NSEC_PER_MSEC) {
>> > - return 0;
>> > + if(timeout > 0) {
>> > + jlong newNanoTime = JVM_NanoTime(env, 0);
>> > + nanoTimeout -= newNanoTime - prevNanoTime;
>> > + if (nanoTimeout < NET_NSEC_PER_MSEC) {
>> > + return 0;
>> > + }
>> > + prevNanoTime = newNanoTime;
>> > + } else {
>> > + continue; // timeout is -1, so loop again.
>> > }
>> > - prevNanoTime = newNanoTime;
>> > } else {
>> > return rv;
>> > }
>> >
>> > ############################################################
>> >
>>
>>
>
More information about the net-dev
mailing list