This is an automated email from the ASF dual-hosted git repository. lgoldstein pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit 3e56932eb496b24962363cb51a9e5ca1798fdc46 Author: Lyor Goldstein <[email protected]> AuthorDate: Mon Feb 18 10:06:06 2019 +0200 [SSHD-896] Fixed parsing of compound KEX extension messages --- .../kex/extension/parser/AbstractKexExtensionParser.java | 4 ---- .../sshd/common/kex/extension/parser/DelayCompression.java | 4 ++++ .../apache/sshd/common/kex/extension/parser/Elevation.java | 8 +++++++- .../sshd/common/kex/extension/parser/NoFlowControl.java | 8 +++++++- .../kex/extension/parser/ServerSignatureAlgorithms.java | 13 ++++++++++++- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/AbstractKexExtensionParser.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/AbstractKexExtensionParser.java index 1d1a3ba..75265f7 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/AbstractKexExtensionParser.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/AbstractKexExtensionParser.java @@ -24,7 +24,6 @@ import java.io.IOException; import org.apache.sshd.common.kex.extension.KexExtensionParser; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; -import org.apache.sshd.common.util.buffer.BufferUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> @@ -44,10 +43,7 @@ public abstract class AbstractKexExtensionParser<T> implements KexExtensionParse @Override public void putExtension(T value, Buffer buffer) throws IOException { buffer.putString(getName()); - int lenPos = buffer.wpos(); - buffer.putInt(0); // placeholder for the encoded value length encode(value, buffer); - BufferUtils.updateLengthPlaceholder(buffer, lenPos); } protected abstract void encode(T value, Buffer buffer) throws IOException; diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/DelayCompression.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/DelayCompression.java index 21763f8..c11002e 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/DelayCompression.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/DelayCompression.java @@ -22,6 +22,7 @@ package org.apache.sshd.common.kex.extension.parser; import java.io.IOException; import org.apache.sshd.common.util.buffer.Buffer; +import org.apache.sshd.common.util.buffer.BufferUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> @@ -46,7 +47,10 @@ public class DelayCompression extends AbstractKexExtensionParser<DelayedCompress @Override protected void encode(DelayedCompressionAlgorithms algos, Buffer buffer) throws IOException { + int lenPos = buffer.wpos(); + buffer.putInt(0); // total length placeholder buffer.putNameList(algos.getClient2Server()); buffer.putNameList(algos.getServer2Client()); + BufferUtils.updateLengthPlaceholder(buffer, lenPos); } } diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/Elevation.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/Elevation.java index abaa15c..d08eca3 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/Elevation.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/Elevation.java @@ -20,6 +20,7 @@ package org.apache.sshd.common.kex.extension.parser; import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.apache.sshd.common.util.buffer.Buffer; @@ -37,8 +38,13 @@ public class Elevation extends AbstractKexExtensionParser<String> { } @Override + public String parseExtension(byte[] data, int off, int len) throws IOException { + return (len <= 0) ? "" : new String(data, off, len, StandardCharsets.UTF_8); + } + + @Override public String parseExtension(Buffer buffer) throws IOException { - return buffer.getString(); + return parseExtension(buffer.array(), buffer.rpos(), buffer.available()); } @Override diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/NoFlowControl.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/NoFlowControl.java index f883131..259adae 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/NoFlowControl.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/NoFlowControl.java @@ -20,6 +20,7 @@ package org.apache.sshd.common.kex.extension.parser; import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.apache.sshd.common.util.buffer.Buffer; @@ -37,8 +38,13 @@ public class NoFlowControl extends AbstractKexExtensionParser<String> { } @Override + public String parseExtension(byte[] data, int off, int len) throws IOException { + return (len <= 0) ? "" : new String(data, off, len, StandardCharsets.UTF_8); + } + + @Override public String parseExtension(Buffer buffer) throws IOException { - return buffer.getString(); + return parseExtension(buffer.array(), buffer.rpos(), buffer.available()); } @Override diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/ServerSignatureAlgorithms.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/ServerSignatureAlgorithms.java index 72b1364..e211cf2 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/ServerSignatureAlgorithms.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/parser/ServerSignatureAlgorithms.java @@ -20,8 +20,12 @@ package org.apache.sshd.common.kex.extension.parser; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.buffer.Buffer; /** @@ -38,8 +42,15 @@ public class ServerSignatureAlgorithms extends AbstractKexExtensionParser<List<S } @Override + public List<String> parseExtension(byte[] data, int off, int len) throws IOException { + String s = (len <= 0) ? "" : new String(data, off, len, StandardCharsets.UTF_8); + String[] vals = GenericUtils.isEmpty(s) ? GenericUtils.EMPTY_STRING_ARRAY : GenericUtils.split(s, ','); + return GenericUtils.isEmpty(vals) ? Collections.emptyList() : Arrays.asList(vals); + } + + @Override public List<String> parseExtension(Buffer buffer) throws IOException { - return buffer.getNameList(); + return parseExtension(buffer.array(), buffer.rpos(), buffer.available()); } @Override
