Repository: mina-sshd
Updated Branches:
  refs/heads/master 97b38fb08 -> de0c923a4


[SSHD-333] Ephemeral port handling is faulty

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

Branch: refs/heads/master
Commit: de0c923a4f87f93971e50bbbd4fe01d037de3936
Parents: 97b38fb
Author: Guillaume Nodet <[email protected]>
Authored: Tue Jul 8 18:56:05 2014 +0200
Committer: Guillaume Nodet <[email protected]>
Committed: Tue Jul 8 18:56:05 2014 +0200

----------------------------------------------------------------------
 sshd-core/src/main/java/org/apache/sshd/SshServer.java  | 10 ++++------
 .../main/java/org/apache/sshd/common/util/IoUtils.java  | 10 ++++++++++
 .../src/test/java/org/apache/sshd/SshServerTest.java    | 12 ++++++++++++
 3 files changed, 26 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/de0c923a/sshd-core/src/main/java/org/apache/sshd/SshServer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/SshServer.java 
b/sshd-core/src/main/java/org/apache/sshd/SshServer.java
index 7d1b439..7074edc 100644
--- a/sshd-core/src/main/java/org/apache/sshd/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/SshServer.java
@@ -84,6 +84,7 @@ import org.apache.sshd.common.signature.SignatureDSA;
 import org.apache.sshd.common.signature.SignatureECDSA;
 import org.apache.sshd.common.signature.SignatureRSA;
 import org.apache.sshd.common.util.CloseableUtils;
+import org.apache.sshd.common.util.IoUtils;
 import org.apache.sshd.common.util.OsUtils;
 import org.apache.sshd.common.util.SecurityUtils;
 import org.apache.sshd.common.util.ThreadUtils;
@@ -334,6 +335,9 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
         timeoutListenerFuture = getScheduledExecutorService()
                 .scheduleAtFixedRate(sessionTimeoutListener, 1, 1, 
TimeUnit.SECONDS);
 
+        if (port == 0) {
+            port = IoUtils.getFreePort();
+        }
         if (host != null) {
             String[] hosts = host.split(",");
             LinkedList<InetSocketAddress> addresses = new 
LinkedList<InetSocketAddress>();
@@ -341,18 +345,12 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
                 InetAddress[] inetAddresses = InetAddress.getAllByName(host);
                 for (InetAddress inetAddress : inetAddresses) {
                     InetSocketAddress inetSocketAddress = new 
InetSocketAddress(inetAddress, port);
-                    if (port == 0) {
-                        port = inetSocketAddress.getPort();
-                    }
                     addresses.add(inetSocketAddress);
                 }
             }
             acceptor.bind(addresses);
         } else {
             acceptor.bind(Collections.singleton(new InetSocketAddress(port)));
-            if (port == 0) {
-                port = ((InetSocketAddress) 
acceptor.getBoundAddresses().iterator().next()).getPort();
-            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/de0c923a/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java 
b/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
index da53e91..77f1de2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/IoUtils.java
@@ -20,6 +20,7 @@ package org.apache.sshd.common.util;
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.net.ServerSocket;
 
 /**
  * TODO Add javadoc
@@ -28,6 +29,15 @@ import java.io.IOException;
  */
 public class IoUtils {
 
+    public static int getFreePort() throws IOException {
+        ServerSocket s = new ServerSocket(0);
+        try {
+            return s.getLocalPort();
+        } finally {
+            s.close();
+        }
+    }
+
     public static void closeQuietly(Closeable... closeables) {
         for (Closeable c : closeables) {
             try {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/de0c923a/sshd-core/src/test/java/org/apache/sshd/SshServerTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/SshServerTest.java 
b/sshd-core/src/test/java/org/apache/sshd/SshServerTest.java
index 247d9dc..2faf54f 100644
--- a/sshd-core/src/test/java/org/apache/sshd/SshServerTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/SshServerTest.java
@@ -28,6 +28,7 @@ import org.apache.sshd.util.Utils;
 import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -70,6 +71,17 @@ public class SshServerTest extends BaseTest {
         assertTrue(executorService.isShutdown());
     }
 
+    @Test
+    public void testDynamicPort() throws Exception {
+        SshServer sshd = createTestServer();
+        sshd.setHost("localhost");
+        sshd.start();
+
+        assertNotEquals(0, sshd.getPort());
+
+        sshd.stop();
+    }
+
 
     private SshServer createTestServer() {
         SshServer sshd = SshServer.setUpDefaultServer();

Reply via email to