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 a9f87e9dd91df8d993f3346336de2cfd6fb3e088 Author: Lyor Goldstein <lgoldst...@apache.org> AuthorDate: Fri Feb 4 08:09:16 2022 +0200 [SSHD-1244] Fixed channel window adjustment handling of large UINT32 values --- CHANGES.md | 2 ++ pom.xml | 1 + .../sshd/common/kex/extension/KexExtensions.java | 2 +- .../kex/extension/parser/DelayCompression.java | 2 +- .../signature/AbstractSecurityKeySignature.java | 2 +- .../org/apache/sshd/common/util/buffer/Buffer.java | 17 ++++++++++---- .../sshd/common/util/buffer/BufferUtils.java | 4 ++-- .../sshd/common/util/buffer/ByteArrayBuffer.java | 2 +- .../apache/sshd/agent/SshAgentKeyConstraint.java | 2 +- .../sshd/agent/common/AbstractAgentClient.java | 10 ++++---- .../sshd/agent/common/AbstractAgentProxy.java | 4 ++-- .../org/apache/sshd/agent/unix/AgentClient.java | 2 +- .../auth/keyboard/UserAuthKeyboardInteractive.java | 2 +- .../client/channel/PtyCapableChannelSession.java | 2 +- .../sshd/common/channel/AbstractChannel.java | 4 ++-- .../common/channel/ChannelAsyncOutputStream.java | 2 +- .../sshd/common/channel/ChannelOutputStream.java | 2 +- .../org/apache/sshd/common/channel/Window.java | 8 +++---- .../sshd/common/forward/DefaultForwarder.java | 4 ++-- .../common/session/helpers/AbstractSession.java | 6 ++--- .../org/apache/sshd/core/CoreModuleProperties.java | 10 +++++--- .../server/auth/hostbased/UserAuthHostBased.java | 2 +- .../server/auth/keyboard/InteractiveChallenge.java | 2 +- .../server/global/CancelTcpipForwardHandler.java | 2 +- .../sshd/server/global/TcpipForwardHandler.java | 2 +- .../session/helpers/AbstractSessionTest.java | 6 ++--- .../deprecated/UserAuthKeyboardInteractive.java | 2 +- .../sshd/server/channel/ChannelSessionTest.java | 27 +++++++++++++++++++++- .../helpers/AbstractCheckFileExtension.java | 2 +- .../sshd/sftp/client/impl/AbstractSftpClient.java | 4 ++-- .../sshd/sftp/client/impl/DefaultSftpClient.java | 10 ++++---- .../sftp/client/impl/SftpInputStreamAsync.java | 3 ++- .../sftp/client/impl/SftpOutputStreamAsync.java | 2 +- .../org/apache/sshd/sftp/common/SftpHelper.java | 6 ++--- .../extensions/SpaceAvailableExtensionInfo.java | 2 +- .../sftp/server/AbstractSftpSubsystemHelper.java | 22 +++++++++--------- .../org/apache/sshd/sftp/server/SftpSubsystem.java | 4 ++-- .../client/impl/SftpRemotePathChannelTest.java | 2 +- 38 files changed, 115 insertions(+), 75 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c884827..9063114 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -40,5 +40,7 @@ this value (though the choice of 256KB should be compatible with the vast majori * [SSHD-1231](https://issues.apache.org/jira/browse/SSHD-1231) Public key authentication: wrong signature algorithm used (ed25519 key with ssh-rsa signature) * [SSHD-1233](https://issues.apache.org/jira/browse/SSHD-1233) Added support for "lim...@openssh.com" SFTP extension +* [SSHD-1244](https://issues.apache.org/jira/browse/SSHD-1244) Fixed channel window adjustment handling of large UINT32 values + diff --git a/pom.xml b/pom.xml index 1ec30dc..7e66769 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,7 @@ <slf4j.version>1.7.32</slf4j.version> <logback.version>1.2.9</logback.version> <spring.version>5.3.14</spring.version> + <!-- NOTE: upgrading to 6.x requires Java 11 --> <jgit.version>5.13.0.202109080827-r</jgit.version> <junit.version>4.13.2</junit.version> <bytebuddy.version>1.12.6</bytebuddy.version> diff --git a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/KexExtensions.java b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/KexExtensions.java index bc21f2e..af82982 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/KexExtensions.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/kex/extension/KexExtensions.java @@ -172,7 +172,7 @@ public final class KexExtensions { */ public static void putExtensions(Collection<? extends Map.Entry<String, ?>> exts, Buffer buffer) throws IOException { int count = GenericUtils.size(exts); - buffer.putInt(count); + buffer.putUInt(count); if (count <= 0) { return; } 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 96a0c31..d09a654 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 @@ -48,7 +48,7 @@ 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.putUInt(0L); // 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/signature/AbstractSecurityKeySignature.java b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSecurityKeySignature.java index 66bebb2..f27ce1b 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSecurityKeySignature.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSecurityKeySignature.java @@ -94,7 +94,7 @@ public abstract class AbstractSecurityKeySignature implements Signature { byte[] appNameDigest = md.digest(publicKey.getAppName().getBytes(StandardCharsets.UTF_8)); byte[] challengeDigest = this.challengeDigest.digest(); ByteArrayBuffer counterData = new ByteArrayBuffer(Integer.BYTES, false); - counterData.putInt(counter); + counterData.putUInt(counter); Signature delegate = getDelegateSignature(); delegate.initVerifier(session, publicKey.getDelegatePublicKey()); diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java index 4c30537..c7c9df5 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java @@ -704,7 +704,14 @@ public abstract class Buffer implements Readable { * @param i The 32-bit value */ public void putInt(long i) { - BufferUtils.validateInt32Value(i, "Invalid 32-bit value: %d"); + BufferUtils.validateInt32Value(i, "Invalid INT32 value: %d"); + ensureCapacity(Integer.BYTES); + BufferUtils.putUInt(i, workBuf, 0, Integer.BYTES); + putRawBytes(workBuf, 0, Integer.BYTES); + } + + public void putUInt(long i) { + BufferUtils.validateUint32Value(i, "Invalid UINT32 value: %d"); ensureCapacity(Integer.BYTES); BufferUtils.putUInt(i, workBuf, 0, Integer.BYTES); putRawBytes(workBuf, 0, Integer.BYTES); @@ -755,7 +762,7 @@ public abstract class Buffer implements Readable { } public void putBytes(byte[] b, int off, int len) { - putInt(len); + putUInt(len); putRawBytes(b, off, len); } @@ -783,7 +790,7 @@ public abstract class Buffer implements Readable { public void putStringList(Collection<?> objects, Charset charset, boolean prependLength) { int numObjects = GenericUtils.size(objects); if (prependLength) { - putInt(numObjects); + putUInt(numObjects); } if (numObjects <= 0) { @@ -933,7 +940,7 @@ public abstract class Buffer implements Readable { public void putMPInt(byte[] mpInt) { if ((mpInt[0] & 0x80) != 0) { - putInt(mpInt.length + 1 /* padding */); + putUInt(mpInt.length + 1 /* padding */); putByte((byte) 0); } else { putInt(mpInt.length); @@ -949,7 +956,7 @@ public abstract class Buffer implements Readable { public void putPublicKey(PublicKey key) { int ow = wpos(); - putInt(0); + putUInt(0L); int ow1 = wpos(); putRawPublicKey(key); int ow2 = wpos(); diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java index 2ee33a8..beaf150 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java @@ -644,7 +644,7 @@ public final class BufferUtils { // NOTE: although data length is defined as UINT32, we do not expected sizes above Integer.MAX_VALUE ValidateUtils.checkTrue(dataLength >= 0, "Illegal data length: %d", dataLength); buffer.wpos(lenPos); - buffer.putInt(dataLength); + buffer.putUInt(dataLength); buffer.wpos(endPos); return dataLength; } @@ -661,7 +661,7 @@ public final class BufferUtils { public static void updateLengthPlaceholder(Buffer buffer, int lenPos, int dataLength) { int curPos = buffer.wpos(); buffer.wpos(lenPos); - buffer.putInt(dataLength); + buffer.putUInt(dataLength); buffer.wpos(curPos); } diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java index 04085ed..3efa761 100644 --- a/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java +++ b/sshd-common/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java @@ -220,7 +220,7 @@ public class ByteArrayBuffer extends Buffer { public void putBuffer(ByteBuffer buffer) { int required = buffer.remaining(); ensureCapacity(required + Integer.SIZE); - putInt(required); + putUInt(required); buffer.get(data, wpos, required); wpos += required; } diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/SshAgentKeyConstraint.java b/sshd-core/src/main/java/org/apache/sshd/agent/SshAgentKeyConstraint.java index 20bafea..c5f5c57 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/SshAgentKeyConstraint.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/SshAgentKeyConstraint.java @@ -96,7 +96,7 @@ public abstract class SshAgentKeyConstraint { @Override public void put(Buffer buffer) { super.put(buffer); - buffer.putInt(secondsToLive); + buffer.putUInt(secondsToLive); } } diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java index 520068c..970c86e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentClient.java @@ -71,7 +71,7 @@ public abstract class AbstractAgentClient extends AbstractLoggingBean { } Buffer rep = new ByteArrayBuffer(); - rep.putInt(0); + rep.putUInt(0L); rep.rpos(rep.wpos()); Buffer req = new ByteArrayBuffer(buffer.getBytes()); @@ -83,9 +83,9 @@ public abstract class AbstractAgentClient extends AbstractLoggingBean { debug("Failed ({}) to handle command={}: {}", e.getClass().getSimpleName(), cmd, e.getMessage(), e); rep.clear(); - rep.putInt(0); + rep.putUInt(0L); rep.rpos(rep.wpos()); - rep.putInt(1); + rep.putUInt(1L); rep.putByte(SshAgentConstants.SSH2_AGENT_FAILURE); } reply(prepare(rep)); @@ -111,7 +111,7 @@ public abstract class AbstractAgentClient extends AbstractLoggingBean { } rep.putByte(SshAgentConstants.SSH2_AGENT_IDENTITIES_ANSWER); - rep.putInt(keys.size()); + rep.putUInt(keys.size()); for (Map.Entry<PublicKey, String> key : keys) { rep.putPublicKey(key.getKey()); rep.putString(key.getValue()); @@ -178,7 +178,7 @@ public abstract class AbstractAgentClient extends AbstractLoggingBean { int wpos = buf.wpos(); buf.rpos(rpos - 4); buf.wpos(rpos - 4); - buf.putInt(len); + buf.putUInt(len); buf.wpos(wpos); return buf; } diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java index 428d07a..a0fa391 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java @@ -253,7 +253,7 @@ public abstract class AbstractAgentProxy extends AbstractLoggingBean implements protected Buffer createBuffer(byte cmd, int extraLen) { Buffer buffer = new ByteArrayBuffer((extraLen <= 0) ? ByteArrayBuffer.DEFAULT_SIZE : extraLen + Byte.SIZE, false); - buffer.putInt(0); + buffer.putUInt(0L); buffer.putByte(cmd); return buffer; } @@ -261,7 +261,7 @@ public abstract class AbstractAgentProxy extends AbstractLoggingBean implements protected Buffer prepare(Buffer buffer) { int wpos = buffer.wpos(); buffer.wpos(0); - buffer.putInt(wpos - 4); + buffer.putUInt(wpos - 4); buffer.wpos(wpos); return buffer; } diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java index ab0966a..7d9ac35 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentClient.java @@ -195,7 +195,7 @@ public class AgentClient extends AbstractAgentProxy implements Runnable, Factory protected synchronized Buffer request(Buffer buffer) throws IOException { int wpos = buffer.wpos(); buffer.wpos(0); - buffer.putInt(wpos - 4); + buffer.putUInt(wpos - 4); buffer.wpos(wpos); synchronized (messages) { int result = Socket.send(handle, buffer.array(), buffer.rpos(), buffer.available()); diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java index ccb942a..412c894 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractive.java @@ -174,7 +174,7 @@ public class UserAuthKeyboardInteractive extends AbstractUserAuth { int numResponses = rep.length; buffer = session.createBuffer( SshConstants.SSH_MSG_USERAUTH_INFO_RESPONSE, numResponses * Long.SIZE + Byte.SIZE); - buffer.putInt(numResponses); + buffer.putUInt(numResponses); for (int index = 0; index < numResponses; index++) { String r = rep[index]; if (traceEnabled) { diff --git a/sshd-core/src/main/java/org/apache/sshd/client/channel/PtyCapableChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/client/channel/PtyCapableChannelSession.java index 88f8f03..214a6d9 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/channel/PtyCapableChannelSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/channel/PtyCapableChannelSession.java @@ -281,7 +281,7 @@ public class PtyCapableChannelSession extends ChannelSession implements PtyChann if (numModes > 0) { ptyModes.forEach((mode, value) -> { modes.putByte((byte) mode.toInt()); - modes.putInt(value.longValue()); + modes.putUInt(value.longValue()); }); } modes.putByte(PtyMode.TTY_OP_END); 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 1bf627e..69c6d24 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 @@ -885,7 +885,7 @@ public abstract class AbstractChannel extends AbstractInnerCloseable implements @Override public void handleWindowAdjust(Buffer buffer) throws IOException { - int window = buffer.getInt(); + long window = buffer.getUInt(); if (log.isDebugEnabled()) { log.debug("handleWindowAdjust({}) SSH_MSG_CHANNEL_WINDOW_ADJUST window={}", this, window); } @@ -1013,7 +1013,7 @@ public abstract class AbstractChannel extends AbstractInnerCloseable implements Session s = getSession(); Buffer buffer = s.createBuffer(SshConstants.SSH_MSG_CHANNEL_WINDOW_ADJUST, Short.SIZE); buffer.putInt(getRecipient()); - buffer.putInt(len); + buffer.putUInt(len); writePacket(buffer); } diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java index 84fbf34..81844a6 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncOutputStream.java @@ -261,7 +261,7 @@ public class ChannelAsyncOutputStream extends AbstractCloseable implements IoOut if (cmd == SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA) { buf.putInt(SshConstants.SSH_EXTENDED_DATA_STDERR); } - buf.putInt(length); + buf.putUInt(length); buf.putRawBytes(buffer.array(), buffer.rpos(), (int) length); buffer.rpos(buffer.rpos() + (int) length); return buf; 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 2937c7d..ec08f8a 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 @@ -230,7 +230,7 @@ public class ChannelOutputStream extends OutputStream implements java.nio.channe int pos = buf.wpos(); buf.wpos((cmd == SshConstants.SSH_MSG_CHANNEL_EXTENDED_DATA) ? 14 : 10); - buf.putInt(length); + buf.putUInt(length); buf.wpos(buf.wpos() + (int) length); if (total == length) { newBuffer((int) length); diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java index 9b175c6..2bb3d8b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java @@ -119,8 +119,8 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha } } - public void expand(int window) { - ValidateUtils.checkTrue(window >= 0, "Negative window size: %d", window); + public void expand(long window) { + BufferUtils.validateUint32Value(window, "Invalid expansion window size: %d"); checkInitialized("expand"); long expandedSize; @@ -128,8 +128,8 @@ public class Window extends AbstractLoggingBean implements java.nio.channels.Cha /* * See RFC-4254 section 5.2: * - * "Implementations MUST correctly handle window sizes of up to 2^32 - 1 bytes. The window MUST NOT be - * increased above 2^32 - 1 bytes. + * "Implementations MUST correctly handle window sizes of up to 2^32 - 1 bytes. + * The window MUST NOT be increased above 2^32 - 1 bytes. */ expandedSize = size + window; if (expandedSize > BufferUtils.MAX_UINT32_VALUE) { diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java index 1c25ec1..df46433 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java @@ -292,7 +292,7 @@ public class DefaultForwarder buffer.putString("tcpip-forward"); buffer.putBoolean(true); // want reply buffer.putString(remoteHost); - buffer.putInt(remotePort); + buffer.putUInt(remotePort); Duration timeout = CoreModuleProperties.FORWARD_REQUEST_TIMEOUT.getRequired(session); Buffer result; @@ -358,7 +358,7 @@ public class DefaultForwarder buffer.putString("cancel-tcpip-forward"); buffer.putBoolean(false); // want reply buffer.putString(remoteHost); - buffer.putInt(port); + buffer.putUInt(port); signalTearingDownExplicitTunnel(bound, false, remote); try { diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java index 08e5d7e..17023d7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java @@ -1013,7 +1013,7 @@ public abstract class AbstractSession extends SessionHelper { int ignoreDataLen = resolveIgnoreBufferDataLength(); if (ignoreDataLen > 0) { ignoreBuf = createBuffer(SshConstants.SSH_MSG_IGNORE, ignoreDataLen + Byte.SIZE); - ignoreBuf.putInt(ignoreDataLen); + ignoreBuf.putUInt(ignoreDataLen); int wpos = ignoreBuf.wpos(); synchronized (random) { @@ -1315,7 +1315,7 @@ public abstract class AbstractSession extends SessionHelper { // Write 5 header bytes buffer.wpos(off); - buffer.putInt(len); + buffer.putUInt(len); buffer.putByte((byte) pad); // Make sure enough room for padding and then fill it buffer.wpos(off + oldLen + SshConstants.SSH_PACKET_HEADER_LEN + pad); @@ -1600,7 +1600,7 @@ public abstract class AbstractSession extends SessionHelper { } buffer.putBoolean(false); // first kex packet follows - buffer.putInt(0); // reserved (FFU) + buffer.putUInt(0L); // reserved (FFU) ReservedSessionMessagesHandler handler = getReservedSessionMessagesHandler(); IoWriteFuture future = (handler == null) ? null : handler.sendKexInitRequest(this, proposal, buffer); diff --git a/sshd-core/src/main/java/org/apache/sshd/core/CoreModuleProperties.java b/sshd-core/src/main/java/org/apache/sshd/core/CoreModuleProperties.java index 71cb4f8..efa7d5f 100644 --- a/sshd-core/src/main/java/org/apache/sshd/core/CoreModuleProperties.java +++ b/sshd-core/src/main/java/org/apache/sshd/core/CoreModuleProperties.java @@ -265,11 +265,13 @@ public final class CoreModuleProperties { public static final Property<Integer> PROP_DHGEX_CLIENT_PRF_KEY = Property.integer("dhgex-client-prf"); + public static final long DEFAULT_WINDOW_SIZE = 0x200000L; + /** * Key used to retrieve the value of the channel window size in the configuration properties map. */ public static final Property<Long> WINDOW_SIZE - = Property.long_("window-size", 0x200000L); + = Property.long_("window-size", DEFAULT_WINDOW_SIZE); /** * Key used to retrieve timeout (msec.) to wait for data to become available when reading from a channel. If not set @@ -296,17 +298,19 @@ public final class CoreModuleProperties { public static final Property<Duration> BUFFERED_IO_OUTPUT_MAX_PENDING_WRITE_WAIT = Property.duration("buffered-io-output-max-pending-write-wait", Duration.ofSeconds(30L)); + public static final long DEFAULT_MAX_PACKET_SIZE = 0x8000L; /** * Key used to retrieve the value of the maximum packet size in the configuration properties map. */ public static final Property<Long> MAX_PACKET_SIZE - = Property.long_("packet-size", 0x8000L); + = Property.long_("packet-size", DEFAULT_MAX_PACKET_SIZE); + public static final long DEFAULT_LIMIT_PACKET_SIZE = Integer.MAX_VALUE / 4L; /** * A safety value that is designed to avoid an attack that uses large channel packet sizes */ public static final Property<Long> LIMIT_PACKET_SIZE - = Property.long_("max-packet-size", Integer.MAX_VALUE / 4L); + = Property.long_("max-packet-size", DEFAULT_LIMIT_PACKET_SIZE); /** * Number of NIO worker threads to use. diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java index db3cdb8..6082f6e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBased.java @@ -164,7 +164,7 @@ public class UserAuthHostBased extends AbstractUserAuth implements SignatureFact buf.putString(getService()); buf.putString(getName()); buf.putString(keyType); - buf.putInt(keyLen); + buf.putUInt(keyLen); // copy the key + certificates buf.putRawBytes(buffer.array(), keyOffset, keyLen); buf.putString(clientHostName); diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/InteractiveChallenge.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/InteractiveChallenge.java index 24053f8..6c64a29 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/InteractiveChallenge.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/InteractiveChallenge.java @@ -98,7 +98,7 @@ public class InteractiveChallenge implements Cloneable { List<PromptEntry> entries = getPrompts(); int numEntries = GenericUtils.size(entries); - buffer.putInt(numEntries); + buffer.putUInt(numEntries); for (int index = 0; index < numEntries; index++) { PromptEntry e = entries.get(index); diff --git a/sshd-core/src/main/java/org/apache/sshd/server/global/CancelTcpipForwardHandler.java b/sshd-core/src/main/java/org/apache/sshd/server/global/CancelTcpipForwardHandler.java index a2fc226..0b7da84 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/global/CancelTcpipForwardHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/global/CancelTcpipForwardHandler.java @@ -70,7 +70,7 @@ public class CancelTcpipForwardHandler extends AbstractConnectionServiceRequestH if (wantReply) { Session session = connectionService.getSession(); buffer = session.createBuffer(SshConstants.SSH_MSG_REQUEST_SUCCESS, Integer.BYTES); - buffer.putInt(port); + buffer.putUInt(port); session.writePacket(buffer); } diff --git a/sshd-core/src/main/java/org/apache/sshd/server/global/TcpipForwardHandler.java b/sshd-core/src/main/java/org/apache/sshd/server/global/TcpipForwardHandler.java index b64d1b2..db983fd 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/global/TcpipForwardHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/global/TcpipForwardHandler.java @@ -76,7 +76,7 @@ public class TcpipForwardHandler extends AbstractConnectionServiceRequestHandler if (wantReply) { Session session = connectionService.getSession(); buffer = session.createBuffer(SshConstants.SSH_MSG_REQUEST_SUCCESS, Integer.BYTES); - buffer.putInt(port); + buffer.putUInt(port); session.writePacket(buffer); } diff --git a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java index a143cab..a0c3d53 100644 --- a/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java +++ b/sshd-core/src/test/java/org/apache/sshd/common/session/helpers/AbstractSessionTest.java @@ -250,7 +250,7 @@ public class AbstractSessionTest extends BaseTestSupport { }); Buffer buffer = new ByteArrayBuffer(Long.SIZE + Byte.MAX_VALUE); - buffer.putInt(Byte.MAX_VALUE + 1); // bad message length + buffer.putUInt(Byte.MAX_VALUE + 1L); // bad message length for (int index = 0; index < Byte.MAX_VALUE; index++) { buffer.putByte((byte) index); session.handleIgnore(buffer); @@ -272,7 +272,7 @@ public class AbstractSessionTest extends BaseTestSupport { buffer.putBoolean(true); session.handleDebug(buffer); // no message field - buffer.putInt(Byte.MAX_VALUE + 1); // bad message field length + buffer.putUInt(Byte.MAX_VALUE + 1L); // bad message field length for (int index = 0; index < Byte.MAX_VALUE; index++) { buffer.putByte((byte) index); session.handleDebug(buffer); @@ -293,7 +293,7 @@ public class AbstractSessionTest extends BaseTestSupport { buffer.putString(getCurrentTestName()); session.handleDebug(buffer); // no language tag - buffer.putInt(Byte.SIZE + 1); // bad language tag length + buffer.putUInt(Byte.SIZE + 1L); // bad language tag length for (int index = 0; index < Byte.SIZE; index++) { buffer.putByte((byte) index); session.handleDebug(buffer); diff --git a/sshd-core/src/test/java/org/apache/sshd/deprecated/UserAuthKeyboardInteractive.java b/sshd-core/src/test/java/org/apache/sshd/deprecated/UserAuthKeyboardInteractive.java index d334846..1b0b3de 100644 --- a/sshd-core/src/test/java/org/apache/sshd/deprecated/UserAuthKeyboardInteractive.java +++ b/sshd-core/src/test/java/org/apache/sshd/deprecated/UserAuthKeyboardInteractive.java @@ -109,7 +109,7 @@ public class UserAuthKeyboardInteractive extends AbstractUserAuth { } buffer = session.createBuffer(SshConstants.SSH_MSG_USERAUTH_INFO_RESPONSE); - buffer.putInt(rep.length); + buffer.putUInt(rep.length); for (String r : rep) { buffer.putString(r); } 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 b9caf27..803b6c1 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 @@ -38,7 +38,9 @@ import org.apache.sshd.common.channel.Channel; 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.BufferUtils; import org.apache.sshd.common.util.buffer.ByteArrayBuffer; +import org.apache.sshd.core.CoreModuleProperties; import org.apache.sshd.server.SshServer; import org.apache.sshd.util.test.BaseTestSupport; import org.apache.sshd.util.test.BogusChannel; @@ -109,7 +111,7 @@ public class ChannelSessionTest extends BaseTestSupport { @Test public void testHandleWindowAdjust() throws Exception { Buffer buffer = new ByteArrayBuffer(); - buffer.putInt(1234); + buffer.putUInt(1234L); try (ChannelSession channelSession = new ChannelSession() { { @@ -148,4 +150,27 @@ public class ChannelSessionTest extends BaseTestSupport { assertEquals("Close listener not called", 1, closeCount.get()); } + + @Test // SSHD-1244 + public void testLargeWindowSizeAdjust() throws Exception { + try (ChannelSession session = new ChannelSession() { + { + Window wRemote = getRemoteWindow(); + wRemote.init(PropertyResolverUtils.toPropertyResolver(Collections.emptyMap())); + } + }) { + Window wRemote = session.getRemoteWindow(); + long initialSize = wRemote.getSize(); + assertTrue("Bad initial window size: " + initialSize, + (initialSize >= CoreModuleProperties.DEFAULT_WINDOW_SIZE) + && (initialSize < BufferUtils.MAX_UINT32_VALUE)); + + Buffer buffer = new ByteArrayBuffer(); + buffer.putUInt(BufferUtils.MAX_UINT32_VALUE); + session.handleWindowAdjust(buffer); + + long updatedSize = wRemote.getSize(); + assertEquals("Mismatched updated window size", BufferUtils.MAX_UINT32_VALUE, updatedSize); + } + } } diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractCheckFileExtension.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractCheckFileExtension.java index 3a1aefc..bc2cf06 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractCheckFileExtension.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractCheckFileExtension.java @@ -48,7 +48,7 @@ public abstract class AbstractCheckFileExtension extends AbstractSftpClientExten buffer.putString(GenericUtils.join(algorithms, ',')); buffer.putLong(offset); buffer.putLong(length); - buffer.putInt(blockSize); + buffer.putUInt(blockSize); if (log.isDebugEnabled()) { log.debug("doGetHash({})[{}] - offset={}, length={}, block-size={}", diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/AbstractSftpClient.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/AbstractSftpClient.java index cef3a6e..78f0b2f 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/AbstractSftpClient.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/AbstractSftpClient.java @@ -660,7 +660,7 @@ public abstract class AbstractSftpClient Buffer buffer = new ByteArrayBuffer(id.length + Long.SIZE /* some extra fields */, false); buffer.putBytes(id); buffer.putLong(fileOffset); - buffer.putInt(len); + buffer.putUInt(len); return checkData(SftpConstants.SSH_FXP_READ, buffer, dstOffset, dst, eofSignalled); } @@ -795,7 +795,7 @@ public abstract class AbstractSftpClient Buffer buffer = new ByteArrayBuffer(path.length() + Long.SIZE /* some extra fields */, false); buffer = putReferencedName(SftpConstants.SSH_FXP_MKDIR, buffer, path, 0); - buffer.putInt(0); + buffer.putUInt(0L); int version = getVersion(); if (version != SftpConstants.SFTP_V3) { diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java index 21f21ac..a543a61 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java @@ -282,14 +282,14 @@ public class DefaultSftpClient extends AbstractSftpClient { int s = buffer.rpos() - hdr; buffer.rpos(s); buffer.wpos(s); - buffer.putInt(1 /* cmd */ + Integer.BYTES /* id */ + len); // length + buffer.putUInt(1 /* cmd */ + Integer.BYTES /* id */ + len); // length buffer.putByte((byte) (cmd & 0xFF)); // cmd - buffer.putInt(id); // id + buffer.putInt(id); buffer.wpos(wpos); buf = buffer; } else { buf = new ByteArrayBuffer(hdr + len); - buf.putInt(1 /* cmd */ + Integer.BYTES /* id */ + len); + buf.putUInt(1 /* cmd */ + Integer.BYTES /* id */ + len); buf.putByte((byte) (cmd & 0xFF)); buf.putInt(id); buf.putBuffer(buffer); @@ -367,9 +367,9 @@ public class DefaultSftpClient extends AbstractSftpClient { // Send init packet Buffer buf = new ByteArrayBuffer(INIT_COMMAND_SIZE + SshConstants.SSH_PACKET_HEADER_LEN); - buf.putInt(INIT_COMMAND_SIZE); + buf.putUInt(INIT_COMMAND_SIZE); buf.putByte((byte) SftpConstants.SSH_FXP_INIT); - buf.putInt(initialVersion); + buf.putUInt(initialVersion); boolean traceEnabled = log.isTraceEnabled(); ClientChannel clientChannel = getClientChannel(); diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java index 3c822e8..a4083f4 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java @@ -155,6 +155,7 @@ public class SftpInputStreamAsync extends InputStreamWithChannel implements Sftp return numXfered; } + @Override @SuppressWarnings("PMD.MissingOverride") public long transferTo(OutputStream out) throws IOException { if (!isOpen()) { @@ -236,7 +237,7 @@ public class SftpInputStreamAsync extends InputStreamWithChannel implements Sftp buf.wpos(23); buf.putBytes(id); buf.putLong(requestOffset); - buf.putInt(bufferSize); + buf.putUInt(bufferSize); int reqId = client.send(SftpConstants.SSH_FXP_READ, buf); SftpAckData ack = new SftpAckData(reqId, requestOffset, bufferSize); if (traceEnabled) { diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java index db6147e..3de58d9 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java @@ -194,7 +194,7 @@ public class SftpOutputStreamAsync extends OutputStreamWithChannel implements Sf buffer.wpos(buffer.rpos()); buffer.putBytes(id); buffer.putLong(offset); - buffer.putInt(avail); + buffer.putUInt(avail); buffer.wpos(wpos); buf = buffer; } else { diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java index 5de859d..a394150 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java @@ -795,7 +795,7 @@ public final class SftpHelper { public static <B extends Buffer> B writeExtensions(B buffer, Map<?, ?> extensions) { int numExtensions = MapEntryUtils.size(extensions); - buffer.putInt(numExtensions); + buffer.putUInt(numExtensions); if (numExtensions <= 0) { return buffer; } @@ -1005,7 +1005,7 @@ public final class SftpHelper { public static <B extends Buffer> B writeACLs(B buffer, int version, Collection<? extends AclEntry> acl) { int lenPos = buffer.wpos(); - buffer.putInt(0); // length placeholder + buffer.putUInt(0L); // length placeholder buffer = encodeACLs(buffer, version, acl); BufferUtils.updateLengthPlaceholder(buffer, lenPos); return buffer; @@ -1014,7 +1014,7 @@ public final class SftpHelper { public static <B extends Buffer> B encodeACLs(B buffer, int version, Collection<? extends AclEntry> acl) { Objects.requireNonNull(acl, "No ACL"); if (version >= SftpConstants.SFTP_V6) { - buffer.putInt(0); // TODO handle ACL flags + buffer.putUInt(0L); // TODO handle ACL flags } int numEntries = GenericUtils.size(acl); diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/extensions/SpaceAvailableExtensionInfo.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/extensions/SpaceAvailableExtensionInfo.java index 961bc25..abc7fe7 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/extensions/SpaceAvailableExtensionInfo.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/extensions/SpaceAvailableExtensionInfo.java @@ -121,6 +121,6 @@ public class SpaceAvailableExtensionInfo implements Cloneable { buffer.putLong(info.unusedBytesOnDevice); buffer.putLong(info.bytesAvailableToUser); buffer.putLong(info.unusedBytesAvailableToUser); - buffer.putInt(info.bytesPerAllocationUnit & 0xFFFFFFFFL); + buffer.putUInt(info.bytesPerAllocationUnit & 0xFFFFFFFFL); } } diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java index b3e32bf..ba8ca69 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java @@ -1847,7 +1847,7 @@ public abstract class AbstractSftpSubsystemHelper // placeholder for length int lenPos = buffer.wpos(); - buffer.putInt(0); + buffer.putUInt(0L); buffer.putInt(mask); BufferUtils.updateLengthPlaceholder(buffer, lenPos); } @@ -2053,7 +2053,7 @@ public abstract class AbstractSftpSubsystemHelper Collections.unmodifiableMap(versionProperties)); // placeholder for length int lenPos = buffer.wpos(); - buffer.putInt(0); + buffer.putUInt(0L); buffer.putString(resolver.getStringProperty("groupId", getClass().getPackage().getName())); // vendor-name buffer.putString(resolver.getStringProperty("artifactId", getClass().getSimpleName())); // product-name buffer.putString(resolver.getStringProperty("version", FactoryManager.DEFAULT_VERSION)); // product-version @@ -2073,21 +2073,21 @@ public abstract class AbstractSftpSubsystemHelper buffer.putString(SftpConstants.EXT_SUPPORTED); int lenPos = buffer.wpos(); - buffer.putInt(0); // length placeholder + buffer.putUInt(0L); // length placeholder // supported-attribute-mask buffer.putInt(SftpConstants.SSH_FILEXFER_ATTR_SIZE | SftpConstants.SSH_FILEXFER_ATTR_PERMISSIONS | SftpConstants.SSH_FILEXFER_ATTR_ACCESSTIME | SftpConstants.SSH_FILEXFER_ATTR_CREATETIME | SftpConstants.SSH_FILEXFER_ATTR_MODIFYTIME | SftpConstants.SSH_FILEXFER_ATTR_OWNERGROUP | SftpConstants.SSH_FILEXFER_ATTR_BITS); // TODO: supported-attribute-bits - buffer.putInt(0); + buffer.putUInt(0L); // supported-open-flags buffer.putInt(SftpConstants.SSH_FXF_READ | SftpConstants.SSH_FXF_WRITE | SftpConstants.SSH_FXF_APPEND | SftpConstants.SSH_FXF_CREAT | SftpConstants.SSH_FXF_TRUNC | SftpConstants.SSH_FXF_EXCL); // TODO: supported-access-mask - buffer.putInt(0); + buffer.putUInt(0L); // max-read-size - buffer.putInt(0); + buffer.putUInt(0L); // supported extensions buffer.putStringList(extras, false); @@ -2108,20 +2108,20 @@ public abstract class AbstractSftpSubsystemHelper buffer.putString(SftpConstants.EXT_SUPPORTED2); int lenPos = buffer.wpos(); - buffer.putInt(0); // length placeholder + buffer.putUInt(0L); // length placeholder // supported-attribute-mask buffer.putInt(SftpConstants.SSH_FILEXFER_ATTR_SIZE | SftpConstants.SSH_FILEXFER_ATTR_PERMISSIONS | SftpConstants.SSH_FILEXFER_ATTR_ACCESSTIME | SftpConstants.SSH_FILEXFER_ATTR_CREATETIME | SftpConstants.SSH_FILEXFER_ATTR_MODIFYTIME | SftpConstants.SSH_FILEXFER_ATTR_OWNERGROUP | SftpConstants.SSH_FILEXFER_ATTR_BITS); // TODO: supported-attribute-bits - buffer.putInt(0); + buffer.putUInt(0L); // supported-open-flags buffer.putInt(SftpConstants.SSH_FXF_ACCESS_DISPOSITION | SftpConstants.SSH_FXF_APPEND_DATA); // TODO: supported-access-mask - buffer.putInt(0); + buffer.putUInt(0L); // max-read-size - buffer.putInt(0); + buffer.putUInt(0L); // supported-open-block-vector buffer.putShort(0); // supported-block-vector @@ -2151,7 +2151,7 @@ public abstract class AbstractSftpSubsystemHelper protected void sendLink(Buffer buffer, int id, Path file, String link) throws IOException { buffer.putByte((byte) SftpConstants.SSH_FXP_NAME); buffer.putInt(id); - buffer.putInt(1); // one response + buffer.putUInt(1L); // one response // in case we are running on Windows String unixPath = link.replace(File.separatorChar, '/'); diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java index 34421cb..fdd4bae 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java @@ -991,7 +991,7 @@ public class SftpSubsystem buffer = prepareReply(buffer); buffer.putByte((byte) SftpConstants.SSH_FXP_VERSION); - buffer.putInt(version); + buffer.putUInt(version); appendExtensions(buffer, negotiated.getValue()); SftpEventListener listener = getSftpEventListenerProxy(); @@ -1003,7 +1003,7 @@ public class SftpSubsystem @Override protected Buffer prepareReply(Buffer buffer) { buffer.clear(); - buffer.putInt(0); // reserve space for actual packet length + buffer.putUInt(0L); // reserve space for actual packet length return buffer; } diff --git a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/impl/SftpRemotePathChannelTest.java b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/impl/SftpRemotePathChannelTest.java index bdabd91..62fba0b 100644 --- a/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/impl/SftpRemotePathChannelTest.java +++ b/sshd-sftp/src/test/java/org/apache/sshd/sftp/client/impl/SftpRemotePathChannelTest.java @@ -309,7 +309,7 @@ public class SftpRemotePathChannelTest extends AbstractSftpClientTestSupport { Buffer requestBuffer = new ByteArrayBuffer(id.length + Long.SIZE, false); requestBuffer.putBytes(id); requestBuffer.putLong(curPos); - requestBuffer.putInt(readLength); + requestBuffer.putUInt(readLength); ((RawSftpClient) sftp).send(SftpConstants.SSH_FXP_READ, requestBuffer); Thread.sleep(1L);