You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by hu...@apache.org on 2014/09/16 09:27:30 UTC

git commit: updated refs/heads/bugfix/CID-116538 to 1760a60

Repository: cloudstack
Updated Branches:
  refs/heads/bugfix/CID-116538 [created] 1760a60eb


Fix resource leaks on exception paths


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1760a60e
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1760a60e
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1760a60e

Branch: refs/heads/bugfix/CID-116538
Commit: 1760a60ebc4cab1cf29430576af052957add7495
Parents: 50990c4
Author: Hugo Trippaers <ht...@schubergphilis.com>
Authored: Tue Sep 16 09:27:05 2014 +0200
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Tue Sep 16 09:27:05 2014 +0200

----------------------------------------------------------------------
 utils/src/com/cloud/utils/nio/Link.java      |  7 +++--
 utils/src/com/cloud/utils/nio/NioClient.java | 36 ++++++++---------------
 utils/src/com/cloud/utils/nio/NioServer.java | 11 +++----
 3 files changed, 23 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1760a60e/utils/src/com/cloud/utils/nio/Link.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/nio/Link.java b/utils/src/com/cloud/utils/nio/Link.java
index 36a8e60..e4291d0 100755
--- a/utils/src/com/cloud/utils/nio/Link.java
+++ b/utils/src/com/cloud/utils/nio/Link.java
@@ -31,6 +31,7 @@ import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ReadableByteChannel;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
+import java.security.GeneralSecurityException;
 import java.security.KeyStore;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentLinkedQueue;
@@ -159,7 +160,7 @@ public class Link {
             pkgBuf.clear();
             engResult = sslEngine.wrap(buffers, pkgBuf);
             if (engResult.getHandshakeStatus() != HandshakeStatus.FINISHED && engResult.getHandshakeStatus() != HandshakeStatus.NOT_HANDSHAKING &&
-                engResult.getStatus() != SSLEngineResult.Status.OK) {
+                    engResult.getStatus() != SSLEngineResult.Status.OK) {
                 throw new IOException("SSL: SSLEngine return bad result! " + engResult);
             }
 
@@ -285,7 +286,7 @@ public class Link {
             appBuf = ByteBuffer.allocate(sslSession.getApplicationBufferSize() + 40);
             engResult = _sslEngine.unwrap(_readBuffer, appBuf);
             if (engResult.getHandshakeStatus() != HandshakeStatus.FINISHED && engResult.getHandshakeStatus() != HandshakeStatus.NOT_HANDSHAKING &&
-                engResult.getStatus() != SSLEngineResult.Status.OK) {
+                    engResult.getStatus() != SSLEngineResult.Status.OK) {
                 throw new IOException("SSL: SSLEngine return bad result! " + engResult);
             }
             if (remaining == _readBuffer.remaining()) {
@@ -405,7 +406,7 @@ public class Link {
         _connection.scheduleTask(task);
     }
 
-    public static SSLContext initSSLContext(boolean isClient) throws Exception {
+    public static SSLContext initSSLContext(boolean isClient) throws GeneralSecurityException, IOException {
         InputStream stream;
         SSLContext sslContext = null;
         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1760a60e/utils/src/com/cloud/utils/nio/NioClient.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/nio/NioClient.java b/utils/src/com/cloud/utils/nio/NioClient.java
index 34d03c2..f4b1029 100755
--- a/utils/src/com/cloud/utils/nio/NioClient.java
+++ b/utils/src/com/cloud/utils/nio/NioClient.java
@@ -24,6 +24,7 @@ import java.net.InetSocketAddress;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
+import java.security.GeneralSecurityException;
 
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
@@ -48,30 +49,23 @@ public class NioClient extends NioConnection {
     @Override
     protected void init() throws IOException {
         _selector = Selector.open();
-        SocketChannel sch = null;
-        InetSocketAddress addr = null;
+        Task task = null;
 
-        try {
-            sch = SocketChannel.open();
+        try (SocketChannel sch = SocketChannel.open()) {
             sch.configureBlocking(true);
             s_logger.info("Connecting to " + _host + ":" + _port);
 
             if (_bindAddress != null) {
                 s_logger.info("Binding outbound interface at " + _bindAddress);
 
-                addr = new InetSocketAddress(_bindAddress, 0);
-                sch.socket().bind(addr);
+                InetSocketAddress bindAddr = new InetSocketAddress(_bindAddress, 0);
+                sch.socket().bind(bindAddr);
             }
 
-            addr = new InetSocketAddress(_host, _port);
-            sch.connect(addr);
-        } catch (IOException e) {
-            _selector.close();
-            throw e;
-        }
+            InetSocketAddress peerAddr = new InetSocketAddress(_host, _port);
+            sch.connect(peerAddr);
 
-        SSLEngine sslEngine = null;
-        try {
+            SSLEngine sslEngine = null;
             // Begin SSL handshake in BLOCKING mode
             sch.configureBlocking(true);
 
@@ -82,15 +76,10 @@ public class NioClient extends NioConnection {
             Link.doHandshake(sch, sslEngine, true);
             s_logger.info("SSL: Handshake done");
             s_logger.info("Connected to " + _host + ":" + _port);
-        } catch (Exception e) {
-            _selector.close();
-            throw new IOException("SSL: Fail to init SSL! " + e);
-        }
 
-        Task task = null;
-        try {
+
             sch.configureBlocking(false);
-            Link link = new Link(addr, this);
+            Link link = new Link(peerAddr, this);
             link.setSSLEngine(sslEngine);
             SelectionKey key = sch.register(_selector, SelectionKey.OP_READ);
             link.setKey(key);
@@ -98,9 +87,10 @@ public class NioClient extends NioConnection {
             // Notice we've already connected due to the handshake, so let's get the
             // remaining task done
             task = _factory.create(Task.Type.CONNECT, link, null);
-        } catch (Exception e) {
+        } catch (GeneralSecurityException e) {
+            throw new IOException("Failed to initialise security", e);
+        } finally {
             _selector.close();
-            throw new IOException("Fail to init NioClient! " + e);
         }
         _executor.execute(task);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1760a60e/utils/src/com/cloud/utils/nio/NioServer.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/nio/NioServer.java b/utils/src/com/cloud/utils/nio/NioServer.java
index 50c33c8..2c640b3 100755
--- a/utils/src/com/cloud/utils/nio/NioServer.java
+++ b/utils/src/com/cloud/utils/nio/NioServer.java
@@ -46,13 +46,14 @@ public class NioServer extends NioConnection {
     protected void init() throws IOException {
         _selector = SelectorProvider.provider().openSelector();
 
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.configureBlocking(false);
+        try (ServerSocketChannel ssc = ServerSocketChannel.open()) {
+            ssc.configureBlocking(false);
 
-        _localAddr = new InetSocketAddress(_port);
-        ssc.socket().bind(_localAddr);
+            _localAddr = new InetSocketAddress(_port);
+            ssc.socket().bind(_localAddr);
 
-        ssc.register(_selector, SelectionKey.OP_ACCEPT, null);
+            ssc.register(_selector, SelectionKey.OP_ACCEPT, null);
+        }
 
         s_logger.info("NioConnection started and listening on " + _localAddr.toString());
     }