Doesn't the socket get created by the createImpl before the bind in the Socket constructor? Then bind or connect might throw an IllegalArgumentException.
private Socket(SocketAddress address, SocketAddress localAddr, boolean stream) throws IOException { setImpl(); // backward compatibility if (address == null) throw new NullPointerException(); try { createImpl(stream); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if (localAddr != null) bind(localAddr); if (address != null) connect(address); } catch (IOException e) { close(); throw e; } } -----Original Message----- From: Michael McMahon [mailto:michael.x.mcma...@oracle.com] Sent: Thursday, September 08, 2011 4:11 AM To: chris hegarty Cc: Salter, Thomas A; net-dev@openjdk.java.net Subject: Re: Datagram socket leak On 07/09/11 21:54, chris hegarty wrote: > On 07/09/2011 17:24, Michael McMahon wrote: >> Hi all, >> >> I've posted a webrev for this at: >> >> http://cr.openjdk.java.net/~michaelm/7085981/webrev.1/ >> >> After checking Socket and ServerSocket, I believe they are not actually >> affected by this issue. The IllegalArgumentExceptions are thrown >> before the >> impl is created in both cases. > > Sorry Michael, I don't see this. It looks like the impl is create in > the private Socket before bind is called, then bind can throw IAE. Or > have I missed something. > > Trivially, the no-args constructor can call this(new > InetSocketAddress(0)). I just noticed that these are the same. > > -Chris. > Chris, The impl is set but the socket is not created until impl.create() is called. - Michael.