RFR 8224477 [13] java.net.Socket::setOption - implementation mismatch to spec

Alan Bateman Alan.Bateman at oracle.com
Thu May 23 08:13:57 UTC 2019


On 22/05/2019 13:54, Chris Hegarty wrote:
>
> While we're here, let's address both the NPE and the IAE.
Okay, I only mentioned it because the JIRA issue had two cases. Also 
it's one that we came across when working on the new implementation (it 
is called out as a compatibility difference in the Risks and Assumptions 
second). Part of this is that Socket.setOption specifies IAE for invalid 
values but SocketImpl.setOption doesn't specify anything. The validation 
of the value has to be done by the SocketImpl as it may relate to socket 
options that the Socket API doesn't know anything about so I think 
SocketImpl.setOption has to specify IAE. I'm not suggesting we expand 
the scope of the issue here but they are related.

>
> Updated webrev:
> https://cr.openjdk.java.net/~chegar/8224477/webrev.01/index.html
>
> The code to check that specific option values are within the specified
> range is independent of the particular socket type. I decided to add it
> to StandardSocketOptions for two reasons: 1) co-location with its
> textual range specification, and 2) is it currently only required by the
> plain socket implementations. This could be located elsewhere, and
> possibly shared by other code performing range checking ( since these
> checks need to be consistent ).
>
> Since the test is more involved now, I created and new separate test, so
> there will be no conflict with upcoming changes to OptionsTest.
I went through the webrev.

The new test looks great. A suggestion for the name is NullsAndBadValues 
as that sort of sums up what it does.

One comment on AbstractPlainSocketImpl.setOption is that it means calls 
to the impl setOption will call PlainSocketImpl.setOption, it will 
delegate to the super class, which will in turn delegate to its super 
class. I'm just wondering if the PlainSocketImpl.setOption can be 
subsumed into AbstractPlainSocketImpl.

I don't think StandardSocketOptions is the right place for 
throwIfIllegalValue. It may be convenient but this class defines 
constants and wasn't really meant to be a helper class too. I guess one 
could make StdSocketOption package private and add a validate check but 
I think that would complicate it too. The check also reminds me that 0 
is valid as the send/receive buffer size in some APIs but not in others. 
This may be something we re-visit in time as it might make sense to have 
IAE throw on platforms where 0 is not valid.

>
> I verified the test against the NioSocketImpl, and it passes fine for
> all cases except one, SO_REUSEADDR. The NioSocketImpl::setOption method
> throws NPE instead of IAE when passed a null value. Easy to resolve,
> then both socket implementations behave consistently, with regard to
> exceptions being thrown for bad input.
Thanks for checking this. Windows uses exclude bind so SO_REUSEADDR is a 
no-op, that code path needs to check the value is null before casting it 
to a Boolean.

>
> Once we agree the code changes, I'll file a CSR to track the change in
> behaviour.
Right, there's behavior change so a CSR make sense.

-Alan


More information about the net-dev mailing list