RFR: 8189366: SocketInputStream.available() should check for eof

vyom tewari vyom.tewari at oracle.com
Fri Oct 12 11:22:27 UTC 2018



On Friday 12 October 2018 04:31 PM, Chris Hegarty wrote:
> Daniel,
>
> On 12/10/18 11:26, Daniel Fuchs wrote:
>> Hi,
>>
>> Maybe a more conservative implementation could have been:
>>
>>     int available = impl.available();
>>     return eof ? 0 : available;
>
> That buys us little more than we had prior to this change,
> since impl.available will still call into native before
> checking the EOF status.
>
> If we want to keep this, then we need:
>
>     public int available() throws IOException {
>         if (impl.isClosedOrPending()) {
>             throw new SocketException("Socket closed");
>         }
>
>         if (eof) {
>             return 0;
>         } else {
>             return impl.available();
>         }
>     }
>
Above change is working as expected, i  modified the "CloseAvailable"  
test little bit and with modified code, SocketInputstream.available() is 
now throwing "java.net.SocketException: Socket closed" exception if the 
underline socket is closed.

I will prepare a patch along with modified test and send it for review.

I ran our internal tests and it looks like  it was not caught there.

Thanks,
Vyom

>> I almost suggested that yesterday, but I saw that
>> read() already had a logic similar to what Vyom was
>> proposing for available:
>>
>>   146         // EOF already encountered
>>   147         if (eof) {
>>   148             return -1;
>>   149         }
>>
>> which AFAICT  means that read returns -1 instead of throwing
>> if the socket is closed and EOF was previously reached.
>
> That is correct. While not intuitive, I don't propose
> that we change this. ( if this were a new implementation
> then I think it should throw IOE for this scenario, but
> we are where we are ).
>
> -Chris.
>
>
>> best regards,
>>
>> -- daniel
>>
>> On 12/10/2018 09:55, Chris Hegarty wrote:
>>>
>>> On 12/10/18 08:29, Alan Bateman wrote:
>>>> On 11/10/2018 09:03, vyom tewari wrote:
>>>>> Hi Chris,
>>>>>
>>>>> Thanks for review, please find the updated 
>>>>> webrev(http://cr.openjdk.java.net/~vtewari/8189366/webrev0.1/index.html) 
>>>>> where i included the test.
>>>> Can you explain the behavior change for the closed socket case? 
>>>> Will this change mean that available returns 0 when it previously 
>>>> throw IOException?
>>>
>>> You are correct. This is not intentional, or desirable.
>>>
>>> We should revert the change or add an additional check
>>> for isClosedOrPending. Since this is already pushed, I
>>> filed a new JIRA issue to track this.
>>>
>>>    https://bugs.openjdk.java.net/browse/JDK-8212114
>>>
>>> -Chris.
>>>
>>



More information about the net-dev mailing list