You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2016/01/27 13:31:06 UTC

mina-sshd git commit: [SSHD-629] Use consistent max. packet size configuration throughout the code

Repository: mina-sshd
Updated Branches:
  refs/heads/master 89768c3ee -> c644ad82d


[SSHD-629] Use consistent max. packet size configuration throughout the code


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

Branch: refs/heads/master
Commit: c644ad82d579773e1483b78b5052dceafd0868b6
Parents: 89768c3
Author: Lyor Goldstein <lg...@vmware.com>
Authored: Wed Jan 27 14:30:54 2016 +0200
Committer: Lyor Goldstein <lg...@vmware.com>
Committed: Wed Jan 27 14:30:54 2016 +0200

----------------------------------------------------------------------
 .../sshd/agent/local/AgentForwardedChannel.java |  7 ++-
 .../agent/local/ChannelAgentForwarding.java     |  2 +-
 .../sshd/agent/unix/AgentForwardedChannel.java  |  7 ++-
 .../sshd/agent/unix/ChannelAgentForwarding.java |  2 +-
 .../client/channel/AbstractClientChannel.java   | 18 +++++--
 .../sshd/client/channel/ChannelDirectTcpip.java | 14 ++++--
 .../sshd/client/channel/ChannelSession.java     | 12 +++--
 .../sshd/common/channel/AbstractChannel.java    | 51 ++++++++++++++------
 .../sshd/common/forward/TcpipClientChannel.java | 11 +++--
 .../server/channel/AbstractServerChannel.java   |  4 +-
 .../sshd/server/channel/ChannelSession.java     | 13 +++--
 .../sshd/server/forward/TcpipServerChannel.java |  7 +--
 .../sshd/server/x11/X11ForwardSupport.java      | 11 +++--
 .../sshd/server/channel/ChannelSessionTest.java |  4 +-
 14 files changed, 111 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentForwardedChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentForwardedChannel.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentForwardedChannel.java
index 377798e..29d70f2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentForwardedChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentForwardedChannel.java
@@ -30,6 +30,7 @@ import org.apache.sshd.agent.common.AbstractAgentProxy;
 import org.apache.sshd.client.channel.AbstractClientChannel;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.channel.ChannelOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
@@ -73,7 +74,9 @@ public class AgentForwardedChannel extends AbstractClientChannel {
                 OutputStream outputStream = getInvertedIn();
                 outputStream.write(buffer.array(), buffer.rpos(), buffer.available());
                 outputStream.flush();
-                localWindow.consumeAndCheck(buffer.available());
+
+                Window wLocal = getLocalWindow();
+                wLocal.consumeAndCheck(buffer.available());
                 if (messages.isEmpty()) {
                     messages.wait();
                 }
@@ -87,7 +90,7 @@ public class AgentForwardedChannel extends AbstractClientChannel {
     @Override
     protected void doOpen() throws IOException {
         ValidateUtils.checkTrue(!Streaming.Async.equals(streaming), "Asynchronous streaming isn't supported yet on this channel");
-        invertedIn = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+        invertedIn = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 2aefbdc..9a2309c 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
@@ -56,7 +56,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
         final OpenFuture f = new DefaultOpenFuture(this);
         ChannelListener listener = getChannelListenerProxy();
         try {
-            out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+            out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
 
             Session session = getSession();
             FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No factory manager");

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java
index ecd3283..f2897c2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentForwardedChannel.java
@@ -24,6 +24,7 @@ import java.io.OutputStream;
 import org.apache.sshd.client.channel.AbstractClientChannel;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.channel.ChannelOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.tomcat.jni.Socket;
 import org.apache.tomcat.jni.Status;
@@ -63,7 +64,7 @@ public class AgentForwardedChannel extends AbstractClientChannel implements Runn
     @Override
     protected synchronized void doOpen() throws IOException {
         ValidateUtils.checkTrue(!Streaming.Async.equals(streaming), "Asynchronous streaming isn't supported yet on this channel");
-        invertedIn = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+        invertedIn = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
     }
 
     @Override
@@ -74,7 +75,9 @@ public class AgentForwardedChannel extends AbstractClientChannel implements Runn
 
     @Override
     protected synchronized void doWriteData(byte[] data, int off, int len) throws IOException {
-        localWindow.consumeAndCheck(len);
+        Window wLocal = getLocalWindow();
+        wLocal.consumeAndCheck(len);
+
         int result = Socket.send(socket, data, off, len);
         if (result < Status.APR_SUCCESS) {
             AgentServerProxy.throwException(result);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 06e2c92..f76954b 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
@@ -77,7 +77,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
         final OpenFuture f = new DefaultOpenFuture(this);
         ChannelListener listener = getChannelListenerProxy();
         try {
-            out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+            out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
             authSocket = PropertyResolverUtils.getString(this, SshAgent.SSH_AUTHSOCKET_ENV_NAME);
             pool = Pool.create(AprLibrary.getInstance().getRootPool());
             handle = Local.create(authSocket, pool);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 e14b318..f3eb272 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
@@ -40,6 +40,7 @@ import org.apache.sshd.common.channel.AbstractChannel;
 import org.apache.sshd.common.channel.ChannelAsyncInputStream;
 import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
 import org.apache.sshd.common.channel.ChannelListener;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.io.IoInputStream;
 import org.apache.sshd.common.io.IoOutputStream;
 import org.apache.sshd.common.session.Session;
@@ -288,11 +289,12 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
         }
 
         Session session = getSession();
+        Window wLocal = getLocalWindow();
         Buffer buffer = session.createBuffer(SshConstants.SSH_MSG_CHANNEL_OPEN, type.length() + Integer.SIZE);
         buffer.putString(type);
         buffer.putInt(getId());
-        buffer.putInt(localWindow.getSize());
-        buffer.putInt(localWindow.getPacketSize());
+        buffer.putInt(wLocal.getSize());
+        buffer.putInt(wLocal.getPacketSize());
         writePacket(buffer);
         return openFuture;
     }
@@ -308,7 +310,9 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
 
         Session session = getSession();
         FactoryManager manager = ValidateUtils.checkNotNull(session.getFactoryManager(), "No factory manager");
-        this.remoteWindow.init(rwSize, packetSize, manager.getProperties());
+        Window wRemote = getRemoteWindow();
+        wRemote.init(rwSize, packetSize, manager.getProperties());
+
         ChannelListener listener = getChannelListenerProxy();
         try {
             doOpen();
@@ -377,8 +381,10 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
         } else if (out != null) {
             out.write(data, off, len);
             out.flush();
+
             if (invertedOut == null) {
-                localWindow.consumeAndCheck(len);
+                Window wLocal = getLocalWindow();
+                wLocal.consumeAndCheck(len);
             }
         } else {
             throw new IllegalStateException("No output stream for channel");
@@ -396,8 +402,10 @@ public abstract class AbstractClientChannel extends AbstractChannel implements C
         } else if (err != null) {
             err.write(data, off, len);
             err.flush();
+
             if (invertedErr == null) {
-                localWindow.consumeAndCheck(len);
+                Window wLocal = getLocalWindow();
+                wLocal.consumeAndCheck(len);
             }
         } else {
             throw new IllegalStateException("No error stream for channel");

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 81f733b..0813142 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
@@ -31,6 +31,7 @@ import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
 import org.apache.sshd.common.channel.ChannelOutputStream;
 import org.apache.sshd.common.channel.ChannelPipedInputStream;
 import org.apache.sshd.common.channel.ChannelPipedOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.net.SshdSocketAddress;
@@ -76,12 +77,13 @@ public class ChannelDirectTcpip extends AbstractClientChannel {
         Session session = getSession();
         String remoteName = remote.getHostName();
         String localName = local.getHostName();
+        Window wLocal = getLocalWindow();
         Buffer buffer = session.createBuffer(SshConstants.SSH_MSG_CHANNEL_OPEN,
                             type.length() + remoteName.length() + localName.length() + Long.SIZE);
         buffer.putString(type);
         buffer.putInt(getId());
-        buffer.putInt(localWindow.getSize());
-        buffer.putInt(localWindow.getPacketSize());
+        buffer.putInt(wLocal.getSize());
+        buffer.putInt(wLocal.getPacketSize());
         buffer.putString(remoteName);
         buffer.putInt(remote.getPort());
         buffer.putString(localName);
@@ -96,9 +98,9 @@ public class ChannelDirectTcpip extends AbstractClientChannel {
             asyncIn = new ChannelAsyncOutputStream(this, SshConstants.SSH_MSG_CHANNEL_DATA);
             asyncOut = new ChannelAsyncInputStream(this);
         } else {
-            out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+            out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
             invertedIn = out;
-            ChannelPipedInputStream pis = new ChannelPipedInputStream(this, localWindow);
+            ChannelPipedInputStream pis = new ChannelPipedInputStream(this, getLocalWindow());
             pipe = new ChannelPipedOutputStream(pis);
             in = pis;
             invertedOut = in;
@@ -109,7 +111,9 @@ public class ChannelDirectTcpip extends AbstractClientChannel {
     protected void doWriteData(byte[] data, int off, int len) throws IOException {
         pipe.write(data, off, len);
         pipe.flush();
-        localWindow.consumeAndCheck(len);
+
+        Window wLocal = getLocalWindow();
+        wLocal.consumeAndCheck(len);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 5d951cc..e59f7b3 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
@@ -30,6 +30,7 @@ import org.apache.sshd.common.channel.ChannelOutputStream;
 import org.apache.sshd.common.channel.ChannelPipedInputStream;
 import org.apache.sshd.common.channel.ChannelPipedOutputStream;
 import org.apache.sshd.common.channel.RequestHandler;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.future.CloseFuture;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.buffer.Buffer;
@@ -69,15 +70,17 @@ public class ChannelSession extends AbstractClientChannel {
             asyncOut = new ChannelAsyncInputStream(this);
             asyncErr = new ChannelAsyncInputStream(this);
         } else {
-            invertedIn = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+            invertedIn = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+
+            Window wLocal = getLocalWindow();
             if (out == null) {
-                ChannelPipedInputStream pis = new ChannelPipedInputStream(this, localWindow);
+                ChannelPipedInputStream pis = new ChannelPipedInputStream(this, wLocal);
                 ChannelPipedOutputStream pos = new ChannelPipedOutputStream(pis);
                 out = pos;
                 invertedOut = pis;
             }
             if (err == null) {
-                ChannelPipedInputStream pis = new ChannelPipedInputStream(this, localWindow);
+                ChannelPipedInputStream pis = new ChannelPipedInputStream(this, wLocal);
                 ChannelPipedOutputStream pos = new ChannelPipedOutputStream(pis);
                 err = pos;
                 invertedErr = pis;
@@ -159,7 +162,8 @@ public class ChannelSession extends AbstractClientChannel {
     protected void pumpInputStream() {
         try {
             Session session = getSession();
-            byte[] buffer = new byte[remoteWindow.getPacketSize()];
+            Window wRemote = getRemoteWindow();
+            byte[] buffer = new byte[wRemote.getPacketSize()];
             while (!closeFuture.isClosed()) {
                 int len = securedRead(in, buffer, 0, buffer.length);
                 if (len < 0) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 a958d72..0620ed8 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
@@ -48,7 +48,6 @@ import org.apache.sshd.common.util.Int2IntFunction;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.BufferUtils;
-import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
 import org.apache.sshd.common.util.closeable.AbstractInnerCloseable;
 import org.apache.sshd.common.util.closeable.IoBaseCloseable;
 import org.apache.sshd.common.util.io.IoUtils;
@@ -74,8 +73,6 @@ public abstract class AbstractChannel
 
     protected ExecutorService executor;
     protected boolean shutdownExecutor;
-    protected final Window localWindow;
-    protected final Window remoteWindow;
     protected ConnectionService service;
     protected final AtomicBoolean initialized = new AtomicBoolean(false);
     protected final AtomicBoolean eofReceived = new AtomicBoolean(false);
@@ -92,6 +89,9 @@ public abstract class AbstractChannel
     private int id = -1;
     private int recipient = -1;
     private Session session;
+
+    private final Window localWindow;
+    private final Window remoteWindow;
     /**
      * A {@link Map} of sent requests - key = request name, value = timestamp when
      * request was sent.
@@ -532,7 +532,7 @@ public abstract class AbstractChannel
             this.channelListeners.clear();
         }
 
-        IOException err = IoUtils.closeQuietly(localWindow, remoteWindow);
+        IOException err = IoUtils.closeQuietly(getLocalWindow(), getRemoteWindow());
         if (err != null) {
             if (log.isDebugEnabled()) {
                 log.debug("Failed (" + err.getClass().getSimpleName() + ") to pre-close window(s) of " + this + ": " + err.getMessage());
@@ -571,15 +571,12 @@ public abstract class AbstractChannel
 
     @Override
     public void handleData(Buffer buffer) throws IOException {
-        int len = buffer.getInt();
-        if (len < 0 || len > ByteArrayBuffer.MAX_LEN) {
-            throw new IllegalStateException("Bad item length: " + len);
-        }
+        int len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_DATA, buffer.getInt());
         if (log.isDebugEnabled()) {
             log.debug("handleData({}) SSH_MSG_CHANNEL_DATA len={}", this, len);
         }
         if (log.isTraceEnabled()) {
-            log.trace("handleData({}) data: {}", this, BufferUtils.printHex(buffer.array(), buffer.rpos(), len));
+            log.trace("handleData({}) data: {} ...", this, BufferUtils.printHex(buffer.array(), buffer.rpos(), Math.min(len, Byte.MAX_VALUE)));
         }
         if (isEofSignalled()) {
             // TODO consider throwing an exception
@@ -602,10 +599,8 @@ public abstract class AbstractChannel
             writePacket(buffer);
             return;
         }
-        int len = buffer.getInt();
-        if ((len < 0) || (len > ByteArrayBuffer.MAX_LEN)) {
-            throw new IllegalStateException("Bad item length: " + len);
-        }
+
+        int len = validateIncomingDataSize(SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA, buffer.getInt());
         if (log.isDebugEnabled()) {
             log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_EXTENDED_DATA len={}", this, len);
         }
@@ -620,6 +615,32 @@ public abstract class AbstractChannel
         doWriteExtendedData(buffer.array(), buffer.rpos(), len);
     }
 
+    protected int validateIncomingDataSize(int cmd, int len) {
+        /*
+         * According to RFC 4254 section 5.1
+         *
+         *      The 'maximum packet size' specifies the maximum size of an
+         *      individual data packet that can be sent to the sender
+         *
+         * The local window reflects our preference - i.e., how much our peer
+         * should send at most
+         */
+        Window wLocal = getLocalWindow();
+        int maxLocalSize = wLocal.getPacketSize();
+
+        /*
+         * The reason for the +4 is that there seems to be some confusion whether
+         * the max. packet size includes the length field or not
+         */
+        if ((len < 0) || (len > (maxLocalSize + 4))) {
+            throw new IllegalStateException("Bad length (" + len + ") "
+                    + " for cmd=" + SshConstants.getCommandMessageName(cmd)
+                    + " - max. allowed=" + maxLocalSize);
+        }
+
+        return len;
+    }
+
     @Override
     public void handleEof() throws IOException {
         if (eofReceived.getAndSet(true)) {
@@ -643,7 +664,9 @@ public abstract class AbstractChannel
         if (log.isDebugEnabled()) {
             log.debug("handleWindowAdjust({}) SSH_MSG_CHANNEL_WINDOW_ADJUST window={}", this, window);
         }
-        remoteWindow.expand(window);
+
+        Window wRemote = getRemoteWindow();
+        wRemote.expand(window);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 c531686..94c75a3 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
@@ -29,6 +29,7 @@ import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.channel.ChannelOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.buffer.Buffer;
@@ -95,12 +96,13 @@ public class TcpipClientChannel extends AbstractClientChannel {
         String srcHost = srcAddress.getHostAddress();
         InetAddress dstAddress = dst.getAddress();
         String dstHost = dstAddress.getHostAddress();
+        Window wLocal = getLocalWindow();
         Buffer buffer = session.createBuffer(SshConstants.SSH_MSG_CHANNEL_OPEN,
                 type.length() + srcHost.length() + dstHost.length() + Long.SIZE);
         buffer.putString(type);
         buffer.putInt(getId());
-        buffer.putInt(localWindow.getSize());
-        buffer.putInt(localWindow.getPacketSize());
+        buffer.putInt(wLocal.getSize());
+        buffer.putInt(wLocal.getPacketSize());
         buffer.putString(dstHost);
         buffer.putInt(dst.getPort());
         buffer.putString(srcHost);
@@ -114,7 +116,7 @@ public class TcpipClientChannel extends AbstractClientChannel {
         if (streaming == Streaming.Async) {
             throw new IllegalArgumentException("Asynchronous streaming isn't supported yet on this channel");
         }
-        out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+        out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
         invertedIn = out;
     }
 
@@ -127,7 +129,8 @@ public class TcpipClientChannel extends AbstractClientChannel {
     protected synchronized void doWriteData(byte[] data, int off, int len) throws IOException {
         // Make sure we copy the data as the incoming buffer may be reused
         Buffer buf = ByteArrayBuffer.getCompactClone(data, off, len);
-        localWindow.consumeAndCheck(len);
+        Window wLocal = getLocalWindow();
+        wLocal.consumeAndCheck(len);
         serverSession.write(buf);
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 8e2f5df..3edb2b5 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
@@ -26,6 +26,7 @@ import org.apache.sshd.common.FactoryManager;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.channel.AbstractChannel;
 import org.apache.sshd.common.channel.ChannelListener;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
@@ -60,7 +61,8 @@ public abstract class AbstractServerChannel extends AbstractChannel implements S
 
         Session s = getSession();
         FactoryManager manager = ValidateUtils.checkNotNull(s.getFactoryManager(), "No factory manager");
-        this.remoteWindow.init(rwSize, packetSize, manager.getProperties());
+        Window wRemote = getRemoteWindow();
+        wRemote.init(rwSize, packetSize, manager.getProperties());
         configureWindow();
         return doInit(buffer);
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 5da3993..7363372 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
@@ -40,6 +40,7 @@ import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
 import org.apache.sshd.common.channel.ChannelOutputStream;
 import org.apache.sshd.common.channel.PtyMode;
 import org.apache.sshd.common.channel.RequestHandler;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.file.FileSystemAware;
 import org.apache.sshd.common.file.FileSystemFactory;
 import org.apache.sshd.common.future.CloseFuture;
@@ -174,7 +175,7 @@ public class ChannelSession extends AbstractServerChannel {
             }
         }
 
-        IOException e = IoUtils.closeQuietly(remoteWindow, out, err, receiver);
+        IOException e = IoUtils.closeQuietly(getRemoteWindow(), out, err, receiver);
         if (e != null) {
             if (log.isDebugEnabled()) {
                 log.debug("doCloseImmediately({}) failed ({}) to close resources: {}",
@@ -220,7 +221,8 @@ public class ChannelSession extends AbstractServerChannel {
         if (receiver != null) {
             int r = receiver.data(this, data, off, len);
             if (r > 0) {
-                localWindow.consumeAndCheck(r);
+                Window wLocal = getLocalWindow();
+                wLocal.consumeAndCheck(r);
             }
         } else {
             if (tempBuffer == null) {
@@ -520,8 +522,9 @@ public class ChannelSession extends AbstractServerChannel {
             ((AsyncCommand) command).setIoOutputStream(asyncOut);
             ((AsyncCommand) command).setIoErrorStream(asyncErr);
         } else {
-            out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, false);
-            err = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA, false);
+            Window wRemote = getRemoteWindow();
+            out = new ChannelOutputStream(this, wRemote, log, SshConstants.SSH_MSG_CHANNEL_DATA, false);
+            err = new ChannelOutputStream(this, wRemote, log, SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA, false);
             if (log.isTraceEnabled()) {
                 // Wrap in logging filters
                 String channelId = toString();
@@ -539,7 +542,7 @@ public class ChannelSession extends AbstractServerChannel {
                 setDataReceiver(recv);
                 ((AsyncCommand) command).setIoInputStream(recv.getIn());
             } else {
-                PipeDataReceiver recv = new PipeDataReceiver(this, localWindow);
+                PipeDataReceiver recv = new PipeDataReceiver(this, getLocalWindow());
                 setDataReceiver(recv);
                 command.setInputStream(recv.getIn());
             }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
index c9a3920..11ff1b4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
@@ -34,6 +34,7 @@ import org.apache.sshd.common.channel.ChannelFactory;
 import org.apache.sshd.common.channel.ChannelListener;
 import org.apache.sshd.common.channel.ChannelOutputStream;
 import org.apache.sshd.common.channel.OpenChannelException;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.future.CloseFuture;
 import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.io.IoConnectFuture;
@@ -152,7 +153,7 @@ public class TcpipServerChannel extends AbstractServerChannel {
         }
 
         // TODO: revisit for better threading. Use async io ?
-        out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+        out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
         IoHandler handler = new IoHandler() {
             @SuppressWarnings("synthetic-access")
             @Override
@@ -348,11 +349,11 @@ public class TcpipServerChannel extends AbstractServerChannel {
         // Make sure we copy the data as the incoming buffer may be reused
         Buffer buf = ByteArrayBuffer.getCompactClone(data, off, len);
         ioSession.write(buf).addListener(new SshFutureListener<IoWriteFuture>() {
-            @SuppressWarnings("synthetic-access")
             @Override
             public void operationComplete(IoWriteFuture future) {
                 try {
-                    localWindow.consumeAndCheck(len);
+                    Window wLocal = getLocalWindow();
+                    wLocal.consumeAndCheck(len);
                 } catch (IOException e) {
                     Session session = getSession();
                     session.exceptionCaught(e);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/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 9f90614..8c3f864 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
@@ -34,6 +34,7 @@ import org.apache.sshd.common.PropertyResolverUtils;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.channel.ChannelOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.io.IoAcceptor;
 import org.apache.sshd.common.io.IoHandler;
 import org.apache.sshd.common.io.IoServiceFactory;
@@ -205,12 +206,13 @@ public class X11ForwardSupport extends AbstractInnerCloseable implements IoHandl
 
             InetAddress remoteAddress = remote.getAddress();
             String remoteHost = remoteAddress.getHostAddress();
+            Window wLocal = getLocalWindow();
             Buffer buffer = session.createBuffer(SshConstants.SSH_MSG_CHANNEL_OPEN,
                     remoteHost.length() + type.length() + Integer.SIZE);
             buffer.putString(type);
             buffer.putInt(getId());
-            buffer.putInt(localWindow.getSize());
-            buffer.putInt(localWindow.getPacketSize());
+            buffer.putInt(wLocal.getSize());
+            buffer.putInt(wLocal.getPacketSize());
             buffer.putString(remoteHost);
             buffer.putInt(remote.getPort());
             writePacket(buffer);
@@ -222,7 +224,7 @@ public class X11ForwardSupport extends AbstractInnerCloseable implements IoHandl
             if (streaming == Streaming.Async) {
                 throw new IllegalArgumentException("Asynchronous streaming isn't supported yet on this channel");
             }
-            out = new ChannelOutputStream(this, remoteWindow, log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
+            out = new ChannelOutputStream(this, getRemoteWindow(), log, SshConstants.SSH_MSG_CHANNEL_DATA, true);
             invertedIn = out;
         }
 
@@ -233,7 +235,8 @@ public class X11ForwardSupport extends AbstractInnerCloseable implements IoHandl
 
         @Override
         protected synchronized void doWriteData(byte[] data, int off, int len) throws IOException {
-            localWindow.consumeAndCheck(len);
+            Window wLocal = getLocalWindow();
+            wLocal.consumeAndCheck(len);
             // use a clone in case data buffer is re-used
             serverSession.write(ByteArrayBuffer.getCompactClone(data, off, len));
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/c644ad82/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java b/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
index 97c5cc3..addfa75 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.sshd.common.PropertyResolverUtils;
 import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
+import org.apache.sshd.common.channel.Window;
 import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
 import org.apache.sshd.util.test.BaseTestSupport;
@@ -48,7 +49,8 @@ public class ChannelSessionTest extends BaseTestSupport {
 
         try (ChannelSession channelSession = new ChannelSession() {
                 {
-                    this.remoteWindow.init(PropertyResolverUtils.toPropertyResolver(Collections.<String,Object>emptyMap()));
+                    Window wRemote = getRemoteWindow();
+                    wRemote.init(PropertyResolverUtils.toPropertyResolver(Collections.<String,Object>emptyMap()));
                 }
         }) {
             final AtomicBoolean expanded = new AtomicBoolean(false);