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

Reply via email to