From 393c00fe6cac5b01a36a95b1b71854b4aa161996 Mon Sep 17 00:00:00 2001 From: michaelm Date: Fri, 9 Sep 2011 14:04:44 +0100 Subject: [PATCH] 7085981: XXSocket types depend on impl finalizer to close if constructor throws exception Reviewed-by: alanb, chegar --- src/share/classes/java/net/DatagramSocket.java | 11 +++++++---- src/share/classes/java/net/MulticastSocket.java | 7 ++++++- src/share/classes/java/net/Socket.java | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/share/classes/java/net/DatagramSocket.java b/src/share/classes/java/net/DatagramSocket.java index 31db3393f..7166c5f93 100644 --- a/src/share/classes/java/net/DatagramSocket.java +++ b/src/share/classes/java/net/DatagramSocket.java @@ -174,9 +174,7 @@ class DatagramSocket implements java.io.Closeable { * @see SecurityManager#checkListen */ public DatagramSocket() throws SocketException { - // create a datagram socket. - createImpl(); - bind(new InetSocketAddress(0)); + this(new InetSocketAddress(0)); } /** @@ -221,7 +219,12 @@ class DatagramSocket implements java.io.Closeable { // create a datagram socket. createImpl(); if (bindaddr != null) { - bind(bindaddr); + try { + bind(bindaddr); + } finally { + if (!isBound()) + close(); + } } } diff --git a/src/share/classes/java/net/MulticastSocket.java b/src/share/classes/java/net/MulticastSocket.java index 4ec3a2df6..bb4760f11 100644 --- a/src/share/classes/java/net/MulticastSocket.java +++ b/src/share/classes/java/net/MulticastSocket.java @@ -162,7 +162,12 @@ class MulticastSocket extends DatagramSocket { setReuseAddress(true); if (bindaddr != null) { - bind(bindaddr); + try { + bind(bindaddr); + } finally { + if (!isBound()) + close(); + } } } diff --git a/src/share/classes/java/net/Socket.java b/src/share/classes/java/net/Socket.java index 0b047e4ef..d2bdd529f 100644 --- a/src/share/classes/java/net/Socket.java +++ b/src/share/classes/java/net/Socket.java @@ -425,6 +425,10 @@ class Socket implements java.io.Closeable { } catch (IOException e) { close(); throw e; + } finally { + // if bind() or connect threw a runtime exception + if ((localAddr != null && !bound) || (address != null && !connected)) + close(); } } -- GitLab