Repository: mina-sshd Updated Branches: refs/heads/master 4d794e5e8 -> ea285c6cb
[SSHD-406] Stop parsing pty-req modes for undefined opcodes Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/ea285c6c Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/ea285c6c Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/ea285c6c Branch: refs/heads/master Commit: ea285c6cbff496a81029d12e7706ae4de68fb5f9 Parents: 4d794e5 Author: Guillaume Nodet <[email protected]> Authored: Tue Feb 10 08:31:58 2015 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Tue Feb 10 08:31:58 2015 +0100 ---------------------------------------------------------------------- .../java/org/apache/sshd/common/PtyMode.java | 3 ++- .../sshd/server/channel/ChannelSession.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ea285c6c/sshd-core/src/main/java/org/apache/sshd/common/PtyMode.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/PtyMode.java b/sshd-core/src/main/java/org/apache/sshd/common/PtyMode.java index 3075ce2..47ec123 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/PtyMode.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/PtyMode.java @@ -22,7 +22,8 @@ import java.util.HashMap; import java.util.Map; /** - * A enum describing the tty modes. + * A enum describing the tty modes according to + * <a href="https://tools.ietf.org/html/rfc4254#section-8">RFC 4254 - section 8</a>. * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ea285c6c/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 b2ad04a..e8c0481 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 @@ -339,16 +339,27 @@ public class ChannelSession extends AbstractServerChannel { int tWidth = buffer.getInt(); int tHeight = buffer.getInt(); byte[] modes = buffer.getBytes(); + Environment environment = getEnvironment(); + Map<PtyMode, Integer> ptyModes = environment.getPtyModes(); for (int i = 0; i < modes.length && modes[i] != 0;) { - PtyMode mode = PtyMode.fromInt(modes[i++]); + int opcode = modes[i++] & 0x00FF; + PtyMode mode = PtyMode.fromInt(opcode); + /** + * According to section 8 of RFC 4254: + * "Opcodes 160 to 255 are not yet defined, and cause parsing to stop" + */ + if (mode == null) { + log.warn("Unknown pty opcode value: " + opcode); + break; + } int val = ((modes[i++] << 24) & 0xff000000) | ((modes[i++] << 16) & 0x00ff0000) | ((modes[i++] << 8) & 0x0000ff00) | - ((modes[i++] ) & 0x000000ff); - getEnvironment().getPtyModes().put(mode, val); + ((modes[i++]) & 0x000000ff); + ptyModes.put(mode, val); } if (log.isDebugEnabled()) { - log.debug("pty for channel {}: term={}, size=({} - {}), pixels=({}, {}), modes=[{}]", new Object[] { id, term, tColumns, tRows, tWidth, tHeight, getEnvironment().getPtyModes() }); + log.debug("pty for channel {}: term={}, size=({} - {}), pixels=({}, {}), modes=[{}]", new Object[] { id, term, tColumns, tRows, tWidth, tHeight, ptyModes }); } addEnvVariable(Environment.ENV_TERM, term); addEnvVariable(Environment.ENV_COLUMNS, Integer.toString(tColumns));
