From 25ddd6e154b26c32ac330fd04dd443a53376e2a9 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Mon, 14 Dec 2020 12:16:44 +0100 Subject: [PATCH] Fix #5794 Close socket on bind failure (#5802) * Fix #5794 Close socket on bind failure Fix #5794 Close socket on bind failure * Fix #5794 Close socket on bind failure Fix #5794 Close socket on bind failure * Fix #5794 Close socket on bind failure Update fix with IO.close() --- .../org/eclipse/jetty/jmx/ConnectorServer.java | 11 ++++++++++- .../eclipse/jetty/server/ServerConnector.java | 18 +++++------------- .../eclipse/jetty/server/ShutdownMonitor.java | 12 ++++++++++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java index 58784850e59b..0d8151271e0c 100644 --- a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java +++ b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java @@ -42,6 +42,7 @@ import javax.rmi.ssl.SslRMIClientSocketFactory; import org.eclipse.jetty.util.HostPort; +import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -243,7 +244,15 @@ private ServerSocket createServerSocket(InetAddress address, int port) throws IO if (_sslContextFactory == null) { ServerSocket server = new ServerSocket(); - server.bind(new InetSocketAddress(address, port)); + try + { + server.bind(new InetSocketAddress(address, port)); + } + catch (Throwable e) + { + IO.close(server); + throw e; + } return server; } else diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java index a984d2c4e342..fa01d97c3041 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java @@ -20,7 +20,6 @@ import java.io.Closeable; import java.io.IOException; -import java.net.BindException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; @@ -41,6 +40,7 @@ import org.eclipse.jetty.io.ManagedSelector; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.SocketChannelEndPoint; +import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.annotation.Name; @@ -336,24 +336,16 @@ protected ServerSocketChannel openAcceptChannel() throws IOException if (serverChannel == null) { - serverChannel = ServerSocketChannel.open(); - InetSocketAddress bindAddress = getHost() == null ? new InetSocketAddress(getPort()) : new InetSocketAddress(getHost(), getPort()); - serverChannel.socket().setReuseAddress(getReuseAddress()); + serverChannel = ServerSocketChannel.open(); try { + serverChannel.socket().setReuseAddress(getReuseAddress()); serverChannel.socket().bind(bindAddress, getAcceptQueueSize()); } - catch (BindException e) + catch (Throwable e) { - try - { - serverChannel.close(); - } - catch (IOException ioe) - { - LOG.warn(ioe); - } + IO.close(serverChannel); throw new IOException("Failed to bind to " + bindAddress, e); } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java index c6d50fb620fb..83e164ad68b1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java @@ -271,8 +271,16 @@ private ServerSocket listen() try { ServerSocket serverSocket = new ServerSocket(); - serverSocket.setReuseAddress(true); - serverSocket.bind(new InetSocketAddress(InetAddress.getByName(host), port)); + try + { + serverSocket.setReuseAddress(true); + serverSocket.bind(new InetSocketAddress(InetAddress.getByName(host), port)); + } + catch (Throwable e) + { + IO.close(serverSocket); + throw e; + } if (port == 0) { port = serverSocket.getLocalPort();