Repository: mina-sshd
Updated Branches:
  refs/heads/master 868ad00ed -> 8ba704888


[SSHD-755] Nio2Connector leaks socket if address is unresolvable or unreachable


Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/8ba70488
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/8ba70488
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/8ba70488

Branch: refs/heads/master
Commit: 8ba704888a40f6dc4b1d5d11d4aac641fa0d9453
Parents: 868ad00
Author: Matthew S. Havener <matthave...@gmail.com>
Authored: Thu Jul 13 07:42:15 2017 +0300
Committer: Goldstein Lyor <l...@c-b4.com>
Committed: Thu Jul 13 07:42:40 2017 +0300

----------------------------------------------------------------------
 .../sshd/common/io/nio2/Nio2Connector.java      | 43 +++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/8ba70488/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
----------------------------------------------------------------------
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java 
b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
index c7a9fe5..ad81b74 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java
@@ -33,6 +33,9 @@ import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 
 /**
+ * TODO Add javadoc
+ *
+ * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 public class Nio2Connector extends Nio2Service implements IoConnector {
     public Nio2Connector(FactoryManager manager, IoHandler handler, 
AsynchronousChannelGroup group) {
@@ -46,10 +49,12 @@ public class Nio2Connector extends Nio2Service implements 
IoConnector {
         }
 
         IoConnectFuture future = new DefaultIoConnectFuture(null);
+        AsynchronousSocketChannel channel = null;
+        AsynchronousSocketChannel socket = null;
         try {
             AsynchronousChannelGroup group = getChannelGroup();
-            AsynchronousSocketChannel socket =
-                    setSocketOptions(openAsynchronousSocketChannel(address, 
group));
+            channel = openAsynchronousSocketChannel(address, group);
+            socket = setSocketOptions(channel);
             Nio2CompletionHandler<Void, Object> completionHandler =
                     
ValidateUtils.checkNotNull(createConnectionCompletionHandler(future, socket, 
getFactoryManager(), getIoHandler()),
                                                "No connection completion 
handler created for %s",
@@ -64,18 +69,43 @@ public class Nio2Connector extends Nio2Service implements 
IoConnector {
             if (log.isTraceEnabled()) {
                 log.trace("connect(" + address + ") connection failure 
details", t);
             }
+
+            try {
+                if (socket != null) {
+                    socket.close();
+                }
+            } catch (IOException err) {
+                if (log.isDebugEnabled()) {
+                    log.debug("connect({}) - failed ({}) to close socket: {}",
+                            address, err.getClass().getSimpleName(), 
err.getMessage());
+                }
+            }
+
+            try {
+                if (channel != null) {
+                    channel.close();
+                }
+            } catch (IOException err) {
+                if (log.isDebugEnabled()) {
+                    log.debug("connect({}) - failed ({}) to close channel: {}",
+                            address, err.getClass().getSimpleName(), 
err.getMessage());
+                }
+            }
+
             future.setException(t);
         }
+
         return future;
     }
 
     protected AsynchronousSocketChannel openAsynchronousSocketChannel(
-            SocketAddress address, AsynchronousChannelGroup group) throws 
IOException {
+                SocketAddress address, AsynchronousChannelGroup group)
+                    throws IOException {
         return AsynchronousSocketChannel.open(group);
     }
 
     protected Nio2CompletionHandler<Void, Object> 
createConnectionCompletionHandler(
-            final IoConnectFuture future, final AsynchronousSocketChannel 
socket, final FactoryManager manager, final IoHandler handler) {
+            IoConnectFuture future, AsynchronousSocketChannel socket, 
FactoryManager manager, IoHandler handler) {
         return new Nio2CompletionHandler<Void, Object>() {
             @Override
             @SuppressWarnings("synthetic-access")
@@ -83,7 +113,8 @@ public class Nio2Connector extends Nio2Service implements 
IoConnector {
                 try {
                     Nio2Session session = createSession(manager, handler, 
socket);
                     handler.sessionCreated(session);
-                    sessions.put(session.getId(), session);
+                    long sessionId = session.getId();
+                    sessions.put(sessionId, session);
                     future.setSession(session);
                     session.startReading();
                 } catch (Throwable exc) {
@@ -95,6 +126,7 @@ public class Nio2Connector extends Nio2Service implements 
IoConnector {
                     if (log.isTraceEnabled()) {
                         log.trace("onCompleted - session creation failure 
details", t);
                     }
+
                     try {
                         socket.close();
                     } catch (IOException err) {
@@ -102,6 +134,7 @@ public class Nio2Connector extends Nio2Service implements 
IoConnector {
                             log.debug("onCompleted - failed {} to close 
socket: {}", err.getClass().getSimpleName(), err.getMessage());
                         }
                     }
+
                     future.setException(t);
                 }
             }

Reply via email to