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 2022/02/08 16:37:36 UTC
[mina-sshd] 01/05: [SSHD-1244] Fixed channel window adjustment handling of large UINT32 values
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 <lg...@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 "limits@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);