You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2013/07/19 07:52:21 UTC

[1/4] git commit: Minor code cleanup

Updated Branches:
  refs/heads/master dafc60810 -> 833cedeef


Minor code cleanup

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

Branch: refs/heads/master
Commit: 0e6fccc3724e09400c506463015dd70be4140ee9
Parents: dafc608
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Jul 18 22:44:32 2013 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Jul 18 22:44:32 2013 +0200

----------------------------------------------------------------------
 .../java/org/apache/sshd/common/channel/ChannelOutputStream.java | 4 ++--
 .../java/org/apache/sshd/common/forward/TcpipServerChannel.java  | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e6fccc3/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
index 27e4f8e..62a20be 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
@@ -132,8 +132,8 @@ public class ChannelOutputStream extends OutputStream {
                 channel.getSession().writePacket(buf);
             }
         } catch (WindowClosedException e) {
-          closed = true;
-          throw e;
+            closed = true;
+            throw e;
         } catch (SshException e) {
             throw e;
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0e6fccc3/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
index d2d7c80..c709794 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
@@ -182,8 +182,8 @@ public class TcpipServerChannel extends AbstractServerChannel {
     }
 
     public CloseFuture close(boolean immediately) {
-        return super.close(immediately).addListener(new SshFutureListener() {
-            public void operationComplete(SshFuture sshFuture) {
+        return super.close(immediately).addListener(new SshFutureListener<CloseFuture>() {
+            public void operationComplete(CloseFuture sshFuture) {
                 closeImmediately0();
             }
         });


[2/4] git commit: Add a few debug statements

Posted by gn...@apache.org.
Add a few debug statements

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

Branch: refs/heads/master
Commit: 51eefa6d12caf4f31342675fd98c3aa41369da98
Parents: 0e6fccc
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Jul 18 22:44:47 2013 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Jul 18 22:44:47 2013 +0200

----------------------------------------------------------------------
 .../org/apache/sshd/common/forward/DefaultTcpipForwarder.java   | 5 +++++
 .../main/java/org/apache/sshd/server/session/ServerSession.java | 1 +
 2 files changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/51eefa6d/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java
index 8612744..4b50bb7 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultTcpipForwarder.java
@@ -44,6 +44,8 @@ import org.apache.sshd.common.SshdSocketAddress;
 import org.apache.sshd.common.TcpipForwarder;
 import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.util.Buffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * TODO Add javadoc
@@ -52,6 +54,8 @@ import org.apache.sshd.common.util.Buffer;
  */
 public class DefaultTcpipForwarder extends IoHandlerAdapter implements TcpipForwarder {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTcpipForwarder.class);
+
     private final Session session;
     private final Map<Integer, SshdSocketAddress> localToRemote = new HashMap<Integer, SshdSocketAddress>();
     private final Map<Integer, SshdSocketAddress> remoteToLocal = new HashMap<Integer, SshdSocketAddress>();
@@ -194,6 +198,7 @@ public class DefaultTcpipForwarder extends IoHandlerAdapter implements TcpipForw
     public void sessionClosed(IoSession session) throws Exception {
         TcpipClientChannel channel = (TcpipClientChannel) session.getAttribute(TcpipClientChannel.class);
         if (channel != null) {
+            LOGGER.debug("Session closed, will now close the channel");
             channel.close(false);
         }
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/51eefa6d/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
index 9b16a00..596411f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
@@ -654,6 +654,7 @@ public class ServerSession extends AbstractSession {
     private void globalRequest(Buffer buffer) throws Exception {
         String req = buffer.getString();
         boolean wantReply = buffer.getBoolean();
+        log.debug("Received global request {}", req);
         if (req.startsWith("keepalive@")) {
             // Relatively standard KeepAlive directive, just wants failure
         } else if (req.equals("no-more-sessions@openssh.com")) {


[3/4] git commit: Remove unused import

Posted by gn...@apache.org.
Remove unused import

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

Branch: refs/heads/master
Commit: 9952e99abe23f0a8d08c6950d2d896f6d5ed3e34
Parents: 51eefa6
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Jul 19 07:20:02 2013 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Jul 19 07:20:02 2013 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/sshd/server/session/ServerSession.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/9952e99a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
index 596411f..531dfd6 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerSession.java
@@ -34,7 +34,6 @@ import org.apache.sshd.SshServer;
 import org.apache.sshd.agent.common.AgentForwardSupport;
 import org.apache.sshd.client.future.OpenFuture;
 import org.apache.sshd.common.Channel;
-import org.apache.sshd.common.FactoryManager;
 import org.apache.sshd.common.KeyExchange;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.SshConstants;


[4/4] git commit: [SSHD-238] Improve channel closing behaviours and make sure no packets can be sent after the MSG_CHANNEL_CLOSE has been sent

Posted by gn...@apache.org.
[SSHD-238] Improve channel closing behaviours and make sure no packets can be sent after the MSG_CHANNEL_CLOSE has been sent

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

Branch: refs/heads/master
Commit: 833cedeefc43a4febdd93210e8857f1ab3d95e33
Parents: 9952e99
Author: Guillaume Nodet <gn...@apache.org>
Authored: Fri Jul 19 07:52:13 2013 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Jul 19 07:52:13 2013 +0200

----------------------------------------------------------------------
 .../agent/local/ChannelAgentForwarding.java     |  2 +-
 .../sshd/agent/unix/ChannelAgentForwarding.java |  2 +-
 .../client/channel/AbstractClientChannel.java   |  2 +-
 .../sshd/client/channel/ChannelDirectTcpip.java |  2 +-
 .../apache/sshd/client/channel/ChannelExec.java |  2 +-
 .../sshd/client/channel/ChannelSession.java     |  2 +-
 .../sshd/client/channel/ChannelShell.java       |  8 ++--
 .../sshd/client/channel/ChannelSubsystem.java   |  2 +-
 .../sshd/common/channel/AbstractChannel.java    | 47 +++++++++++++++++---
 .../common/channel/ChannelOutputStream.java     |  2 +-
 .../sshd/common/forward/TcpipClientChannel.java |  2 +-
 .../sshd/common/forward/TcpipServerChannel.java |  2 +-
 .../sshd/common/session/AbstractSession.java    |  6 +++
 .../server/channel/AbstractServerChannel.java   |  2 +-
 .../sshd/server/channel/ChannelSession.java     | 26 +++++------
 .../sshd/server/x11/X11ForwardSupport.java      |  2 +-
 16 files changed, 75 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
index 0536a52..002cb65 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/ChannelAgentForwarding.java
@@ -117,7 +117,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
         log.info("Received channel request: {}", type);
         buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
         buffer.putInt(recipient);
-        session.writePacket(buffer);
+        writePacket(buffer);
     }
 
     protected class AgentClient extends AbstractAgentClient {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
index c88bb8f..0acbe04 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
@@ -143,7 +143,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
         log.info("Received channel request: {}", type);
         buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
         buffer.putInt(recipient);
-        session.writePacket(buffer);
+        writePacket(buffer);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
index 5ef9703..d247b0d 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/AbstractClientChannel.java
@@ -176,7 +176,7 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
         buffer.putInt(id);
         buffer.putInt(localWindow.getSize());
         buffer.putInt(localWindow.getPacketSize());
-        session.writePacket(buffer);
+        writePacket(buffer);
         return openFuture;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
index a0438d0..83b6186 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelDirectTcpip.java
@@ -75,7 +75,7 @@ public class ChannelDirectTcpip extends AbstractClientChannel {
         buffer.putInt(remote.getPort());
         buffer.putString(local.getHostName());
         buffer.putInt(local.getPort());
-        session.writePacket(buffer);
+        writePacket(buffer);
         return openFuture;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
index 30972f3..756a854 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelExec.java
@@ -45,7 +45,7 @@ public class ChannelExec extends ChannelSession {
         buffer.putString("exec");
         buffer.putBoolean(false);
         buffer.putString(command);
-        session.writePacket(buffer);
+        writePacket(buffer);
 
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java
index 9e08e9c..dd05ab8 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSession.java
@@ -85,7 +85,7 @@ public class ChannelSession extends AbstractClientChannel {
                     buffer.wpos(wpos2 + len);
                     remoteWindow.waitAndConsume(len);
                     log.debug("Send SSH_MSG_CHANNEL_DATA on channel {}", id);
-                    session.writePacket(buffer);
+                    writePacket(buffer);
                 } else {
                     sendEof();
                     break;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelShell.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelShell.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelShell.java
index 117b73d..3c3fca4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelShell.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelShell.java
@@ -158,7 +158,7 @@ public class ChannelShell extends ChannelSession {
             buffer.putInt(recipient);
             buffer.putString("auth-agent-req@openssh.com");
             buffer.putBoolean(false);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
 
         if (usePty) {
@@ -179,7 +179,7 @@ public class ChannelShell extends ChannelSession {
             }
             modes.putByte((byte) 0);
             buffer.putBytes(modes.getCompactData());
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
 
         if (!env.isEmpty()) {
@@ -191,7 +191,7 @@ public class ChannelShell extends ChannelSession {
                 buffer.putBoolean(false);
                 buffer.putString(entry.getKey());
                 buffer.putString(entry.getValue());
-                session.writePacket(buffer);
+                writePacket(buffer);
             }
         }
 
@@ -200,7 +200,7 @@ public class ChannelShell extends ChannelSession {
         buffer.putInt(recipient);
         buffer.putString("shell");
         buffer.putBoolean(false);
-        session.writePacket(buffer);
+        writePacket(buffer);
 
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
index 5bbce8e..5833b80 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/ChannelSubsystem.java
@@ -45,7 +45,7 @@ public class ChannelSubsystem extends ChannelSession {
         buffer.putString("subsystem");
         buffer.putBoolean(false);
         buffer.putString(subsystem);
-        session.writePacket(buffer);
+        writePacket(buffer);
 
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
index c6c4ce1..0ae6180 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
@@ -19,7 +19,10 @@
 package org.apache.sshd.common.channel;
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
+import org.apache.mina.core.future.IoFutureListener;
+import org.apache.mina.core.future.WriteFuture;
 import org.apache.sshd.common.Channel;
 import org.apache.sshd.common.FactoryManager;
 import org.apache.sshd.common.Session;
@@ -51,6 +54,7 @@ public abstract class AbstractChannel implements Channel {
     protected boolean eof;
     protected final CloseFuture closeFuture = new DefaultCloseFuture(lock);
     protected boolean closing;
+    protected boolean closedByOtherSide;
 
     public int getId() {
         return id;
@@ -79,6 +83,9 @@ public abstract class AbstractChannel implements Channel {
     }
 
     public CloseFuture close(boolean immediately) {
+        if (closeFuture.isClosed()) {
+            return closeFuture;
+        }
         try {
             synchronized (lock) {
                 if (immediately) {
@@ -92,7 +99,18 @@ public abstract class AbstractChannel implements Channel {
                         log.debug("Send SSH_MSG_CHANNEL_CLOSE on channel {}", id);
                         Buffer buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_CLOSE, 0);
                         buffer.putInt(recipient);
-                        session.writePacket(buffer);
+                        session.writePacket(buffer).addListener(new IoFutureListener<WriteFuture>() {
+                            public void operationComplete(WriteFuture future) {
+                                synchronized (lock) {
+                                    if (closedByOtherSide) {
+                                        log.debug("Message SSH_MSG_CHANNEL_CLOSE written on channel {}", id);
+                                        closeFuture.setClosed();
+                                        doClose();
+                                        lock.notifyAll();
+                                    }
+                                }
+                            }
+                        });
                     }
                 }
             }
@@ -106,15 +124,30 @@ public abstract class AbstractChannel implements Channel {
     public void handleClose() throws IOException {
         log.debug("Received SSH_MSG_CHANNEL_CLOSE on channel {}", id);
         synchronized (lock) {
-            close(false).setClosed();
-            doClose();
-            lock.notifyAll();
+            closedByOtherSide = !closing;
+            if (closedByOtherSide) {
+                close(false);
+            } else {
+                close(false).setClosed();
+                doClose();
+                lock.notifyAll();
+            }
         }
     }
 
     protected void doClose() {
     }
 
+    protected void writePacket(Buffer buffer) throws IOException {
+        synchronized (lock) {
+            if (!closing) {
+                session.writePacket(buffer);
+            } else {
+                log.debug("Discarding output packet because channel is being closed");
+            }
+        }
+    }
+
     public void handleData(Buffer buffer) throws IOException {
         int len = buffer.getInt();
         if (len < 0 || len > 32768) {
@@ -134,7 +167,7 @@ public abstract class AbstractChannel implements Channel {
             log.debug("Send SSH_MSG_CHANNEL_FAILURE on channel {}", id);
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
             return;
         }
         int len = buffer.getInt();
@@ -175,7 +208,7 @@ public abstract class AbstractChannel implements Channel {
         log.debug("Send SSH_MSG_CHANNEL_EOF on channel {}", id);
         Buffer buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_EOF, 0);
         buffer.putInt(recipient);
-        session.writePacket(buffer);
+        writePacket(buffer);
     }
 
     protected void configureWindow() {
@@ -189,6 +222,6 @@ public abstract class AbstractChannel implements Channel {
         Buffer buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_WINDOW_ADJUST, 0);
         buffer.putInt(recipient);
         buffer.putInt(len);
-        session.writePacket(buffer);
+        writePacket(buffer);
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
index 62a20be..e0441ba 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
@@ -129,7 +129,7 @@ public class ChannelOutputStream extends OutputStream {
                 lastSize = length;
                 remoteWindow.waitAndConsume(length);
                 log.debug("Send {} on channel {}", cmd, channel.getId());
-                channel.getSession().writePacket(buf);
+                channel.writePacket(buf);
             }
         } catch (WindowClosedException e) {
             closed = true;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
index d2fa64e..03b3070 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipClientChannel.java
@@ -86,7 +86,7 @@ public class TcpipClientChannel extends AbstractClientChannel {
         buffer.putInt(dst.getPort());
         buffer.putString(src.getAddress().getHostAddress());
         buffer.putInt(src.getPort());
-        session.writePacket(buffer);
+        writePacket(buffer);
         return openFuture;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
index c709794..4c9fa28 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/TcpipServerChannel.java
@@ -206,6 +206,6 @@ public class TcpipServerChannel extends AbstractServerChannel {
         log.info("Received channel request: {}", type);
         buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
         buffer.putInt(recipient);
-        session.writePacket(buffer);
+        writePacket(buffer);
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
index a8c26b2..60e4b47 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
@@ -279,6 +279,12 @@ public abstract class AbstractSession implements Session {
      * @throws IOException
      */
     public void exceptionCaught(Throwable t) {
+        // Ignore exceptions that happen while closing
+        synchronized (lock) {
+            if (closing) {
+                return;
+            }
+        }
         log.warn("Exception caught", t);
         try {
             if (t instanceof SshException) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
index 4ef6509..4ab0412 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/AbstractServerChannel.java
@@ -65,7 +65,7 @@ public abstract class AbstractServerChannel extends AbstractChannel {
             buffer.putString("exit-status");
             buffer.putByte((byte) 0);
             buffer.putInt(v);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
index bf4ae77..b2d8b13 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
@@ -200,7 +200,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (!handleRequest(type, buffer)) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
     }
 
@@ -277,7 +277,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }
@@ -307,7 +307,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }
@@ -328,7 +328,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }
@@ -349,7 +349,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }
@@ -364,7 +364,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         command.start(getEnvironment());
         return true;
@@ -390,7 +390,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         // Launch command
         command.start(getEnvironment());
@@ -414,7 +414,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         // Launch command
         command.start(getEnvironment());
@@ -492,7 +492,7 @@ public class ChannelSession extends AbstractServerChannel {
             if (wantReply) {
                 buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
                 buffer.putInt(recipient);
-                session.writePacket(buffer);
+                writePacket(buffer);
             }
             return true;
         }
@@ -503,7 +503,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }
@@ -517,7 +517,7 @@ public class ChannelSession extends AbstractServerChannel {
             if (wantReply) {
                 buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
                 buffer.putInt(recipient);
-                session.writePacket(buffer);
+                writePacket(buffer);
             }
             return true;
         }
@@ -528,7 +528,7 @@ public class ChannelSession extends AbstractServerChannel {
             if (wantReply) {
                 buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_FAILURE, 0);
                 buffer.putInt(recipient);
-                session.writePacket(buffer);
+                writePacket(buffer);
             }
             return true;
         }
@@ -538,7 +538,7 @@ public class ChannelSession extends AbstractServerChannel {
         if (wantReply) {
             buffer = session.createBuffer(SshConstants.Message.SSH_MSG_CHANNEL_SUCCESS, 0);
             buffer.putInt(recipient);
-            session.writePacket(buffer);
+            writePacket(buffer);
         }
         return true;
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/833cedee/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java b/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java
index dac12a3..23479a3 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/x11/X11ForwardSupport.java
@@ -197,7 +197,7 @@ public class X11ForwardSupport extends IoHandlerAdapter {
             buffer.putInt(localWindow.getPacketSize());
             buffer.putString(remote.getAddress().getHostAddress());
             buffer.putInt(remote.getPort());
-            session.writePacket(buffer);
+            writePacket(buffer);
             return openFuture;
         }