You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2018/04/19 15:08:00 UTC
[4/5] mina-sshd git commit: [SSHD-812] Introduce a prepareReply method
[SSHD-812] Introduce a prepareReply method
Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/6bed356a
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/6bed356a
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/6bed356a
Branch: refs/heads/master
Commit: 6bed356ad40452a385ef8df5c263cd388d870981
Parents: bb37825
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Apr 19 10:39:26 2018 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Apr 19 17:07:38 2018 +0200
----------------------------------------------------------------------
.../sftp/AbstractSftpSubsystemHelper.java | 118 ++++++++++---------
.../server/subsystem/sftp/SftpSubsystem.java | 22 ++--
.../openssh/helpers/OpenSSHExtensionsTest.java | 2 +-
3 files changed, 75 insertions(+), 67 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/6bed356a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
----------------------------------------------------------------------
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
index 6814ef5..bd3335c 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
@@ -310,7 +310,7 @@ public abstract class AbstractSftpSubsystemHelper
}
if ((proposed < low) || (proposed > hig)) {
- sendStatus(BufferUtils.clear(buffer), id, failureOpcode, "Proposed version (" + proposed + ") not in supported range: " + available);
+ sendStatus(prepareReply(buffer), id, failureOpcode, "Proposed version (" + proposed + ") not in supported range: " + available);
return null;
}
@@ -416,7 +416,7 @@ public abstract class AbstractSftpSubsystemHelper
String name = SftpConstants.getCommandMessageName(type);
log.warn("process({})[length={}, type={}, id={}] unknown command",
getServerSession(), length, name, id);
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OP_UNSUPPORTED, "Command " + name + " is unsupported or not implemented");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OP_UNSUPPORTED, "Command " + name + " is unsupported or not implemented");
}
protected abstract void doInit(Buffer buffer, int id) throws IOException;
@@ -488,11 +488,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
handle = doOpen(id, path, pflags, access, attrs);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_OPEN, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_OPEN, path);
return;
}
- sendHandle(BufferUtils.clear(buffer), id, handle);
+ sendHandle(prepareReply(buffer), id, handle);
}
/**
@@ -511,11 +511,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doClose(id, handle);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_CLOSE, handle);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_CLOSE, handle);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "", "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "", "");
}
protected abstract void doClose(int id, String handle) throws IOException;
@@ -535,7 +535,7 @@ public abstract class AbstractSftpSubsystemHelper
try {
ValidateUtils.checkTrue(readLen >= 0, "Illegal requested read length: %d", readLen);
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.ensureCapacity(readLen + Long.SIZE /* the header */, IntUnaryOperator.identity());
buffer.putByte((byte) SftpConstants.SSH_FXP_DATA);
@@ -551,7 +551,7 @@ public abstract class AbstractSftpSubsystemHelper
buffer.wpos(startPos + len);
BufferUtils.updateLengthPlaceholder(buffer, lenPos, len);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_READ, handle, offset, requestedLength);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_READ, handle, offset, requestedLength);
return;
}
@@ -567,11 +567,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doWrite(id, handle, offset, length, buffer.array(), buffer.rpos(), buffer.available());
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_WRITE, handle, offset, length);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_WRITE, handle, offset, length);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doWrite(int id, String handle, long offset, int length, byte[] data, int doff, int remaining) throws IOException;
@@ -588,11 +588,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
attrs = doLStat(id, path, flags);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_LSTAT, path, flags);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_LSTAT, path, flags);
return;
}
- sendAttrs(BufferUtils.clear(buffer), id, attrs);
+ sendAttrs(prepareReply(buffer), id, attrs);
}
protected Map<String, Object> doLStat(int id, String path, int flags) throws IOException {
@@ -615,11 +615,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doSetStat(id, path, attrs);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_SETSTAT, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_SETSTAT, path);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doSetStat(int id, String path, Map<String, ?> attrs) throws IOException {
@@ -643,11 +643,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
attrs = doFStat(id, handle, flags);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_FSTAT, handle, flags);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_FSTAT, handle, flags);
return;
}
- sendAttrs(BufferUtils.clear(buffer), id, attrs);
+ sendAttrs(prepareReply(buffer), id, attrs);
}
protected abstract Map<String, Object> doFStat(int id, String handle, int flags) throws IOException;
@@ -658,11 +658,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doFSetStat(id, handle, attrs);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_FSETSTAT, handle, attrs);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_FSETSTAT, handle, attrs);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doFSetStat(int id, String handle, Map<String, ?> attrs) throws IOException;
@@ -682,11 +682,11 @@ public abstract class AbstractSftpSubsystemHelper
getPathResolutionLinkOption(SftpConstants.SSH_FXP_OPENDIR, "", p);
handle = doOpenDir(id, path, p, options);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_OPENDIR, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_OPENDIR, path);
return;
}
- sendHandle(BufferUtils.clear(buffer), id, handle);
+ sendHandle(prepareReply(buffer), id, handle);
}
protected abstract String doOpenDir(int id, String path, Path p, LinkOption... options) throws IOException;
@@ -706,11 +706,11 @@ public abstract class AbstractSftpSubsystemHelper
doLink(id, targetPath, linkPath, symLink);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_LINK, targetPath, linkPath, symLink);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_LINK, targetPath, linkPath, symLink);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doLink(int id, String targetPath, String linkPath, boolean symLink) throws IOException {
@@ -727,11 +727,11 @@ public abstract class AbstractSftpSubsystemHelper
}
doSymLink(id, targetPath, linkPath);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_SYMLINK, targetPath, linkPath);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_SYMLINK, targetPath, linkPath);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doSymLink(int id, String targetPath, String linkPath) throws IOException {
@@ -748,11 +748,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doOpenSSHHardLink(id, srcFile, dstFile);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, HardLinkExtensionParser.NAME, srcFile, dstFile);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, HardLinkExtensionParser.NAME, srcFile, dstFile);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doOpenSSHHardLink(int id, String srcFile, String dstFile) throws IOException {
@@ -770,11 +770,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
info = doSpaceAvailable(id, path);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_SPACE_AVAILABLE, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_SPACE_AVAILABLE, path);
return;
}
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.putByte((byte) SftpConstants.SSH_FXP_EXTENDED_REPLY);
buffer.putInt(id);
SpaceAvailableExtensionInfo.encode(buffer, info);
@@ -803,11 +803,11 @@ public abstract class AbstractSftpSubsystemHelper
// TODO : implement text-seek - see https://tools.ietf.org/html/draft-ietf-secsh-filexfer-03#section-6.3
doTextSeek(id, handle, line);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_TEXT_SEEK, handle, line);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_TEXT_SEEK, handle, line);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doTextSeek(int id, String handle, long line) throws IOException;
@@ -818,11 +818,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doOpenSSHFsync(id, handle);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, FsyncExtensionParser.NAME, handle);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_EXTENDED, FsyncExtensionParser.NAME, handle);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doOpenSSHFsync(int id, String handle) throws IOException;
@@ -835,13 +835,13 @@ public abstract class AbstractSftpSubsystemHelper
long length = buffer.getLong();
int blockSize = buffer.getInt();
try {
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.putByte((byte) SftpConstants.SSH_FXP_EXTENDED_REPLY);
buffer.putInt(id);
buffer.putString(SftpConstants.EXT_CHECK_FILE);
doCheckFileHash(id, targetType, target, Arrays.asList(algos), startOffset, length, blockSize, buffer);
} catch (Exception e) {
- sendStatus(BufferUtils.clear(buffer), id, e,
+ sendStatus(prepareReply(buffer), id, e,
SftpConstants.SSH_FXP_EXTENDED, targetType, target, algList, startOffset, length, blockSize);
return;
}
@@ -953,12 +953,12 @@ public abstract class AbstractSftpSubsystemHelper
}
} catch (Exception e) {
- sendStatus(BufferUtils.clear(buffer), id, e,
+ sendStatus(prepareReply(buffer), id, e,
SftpConstants.SSH_FXP_EXTENDED, targetType, target, startOffset, length, quickCheckHash);
return;
}
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.putByte((byte) SftpConstants.SSH_FXP_EXTENDED_REPLY);
buffer.putInt(id);
buffer.putString(targetType);
@@ -1085,11 +1085,11 @@ public abstract class AbstractSftpSubsystemHelper
}
l = doReadLink(id, path);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_READLINK, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_READLINK, path);
return;
}
- sendLink(BufferUtils.clear(buffer), id, l);
+ sendLink(prepareReply(buffer), id, l);
}
protected String doReadLink(int id, String path) throws IOException {
@@ -1113,11 +1113,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doRename(id, oldPath, newPath, flags);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_RENAME, oldPath, newPath, flags);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_RENAME, oldPath, newPath, flags);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doRename(int id, String oldPath, String newPath, int flags) throws IOException {
@@ -1166,13 +1166,13 @@ public abstract class AbstractSftpSubsystemHelper
try {
doCopyData(id, readHandle, readOffset, readLength, writeHandle, writeOffset);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e,
+ sendStatus(prepareReply(buffer), id, e,
SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_COPY_DATA,
readHandle, readOffset, readLength, writeHandle, writeOffset);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doCopyData(int id, String readHandle, long readOffset, long readLength, String writeHandle, long writeOffset) throws IOException;
@@ -1186,12 +1186,12 @@ public abstract class AbstractSftpSubsystemHelper
try {
doCopyFile(id, srcFile, dstFile, overwriteDestination);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e,
+ sendStatus(prepareReply(buffer), id, e,
SftpConstants.SSH_FXP_EXTENDED, SftpConstants.EXT_COPY_FILE, srcFile, dstFile, overwriteDestination);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doCopyFile(int id, String srcFile, String dstFile, boolean overwriteDestination) throws IOException {
@@ -1222,11 +1222,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doBlock(id, handle, offset, length, mask);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_BLOCK, handle, offset, length, mask);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_BLOCK, handle, offset, length, mask);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doBlock(int id, String handle, long offset, long length, int mask) throws IOException;
@@ -1238,11 +1238,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doUnblock(id, handle, offset, length);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_UNBLOCK, handle, offset, length);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_UNBLOCK, handle, offset, length);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected abstract void doUnblock(int id, String handle, long offset, long length) throws IOException;
@@ -1259,11 +1259,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
attrs = doStat(id, path, flags);
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_STAT, path, flags);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_STAT, path, flags);
return;
}
- sendAttrs(BufferUtils.clear(buffer), id, attrs);
+ sendAttrs(prepareReply(buffer), id, attrs);
}
protected Map<String, Object> doStat(int id, String path, int flags) throws IOException {
@@ -1376,11 +1376,11 @@ public abstract class AbstractSftpSubsystemHelper
}
}
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_REALPATH, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_REALPATH, path);
return;
}
- sendPath(BufferUtils.clear(buffer), id, result.getKey(), attrs);
+ sendPath(prepareReply(buffer), id, result.getKey(), attrs);
}
protected SimpleImmutableEntry<Path, Boolean> doRealPathV6(
@@ -1431,11 +1431,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doRemoveDirectory(id, path, IoUtils.getLinkOptions(false));
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_RMDIR, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_RMDIR, path);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doRemoveDirectory(int id, String path, LinkOption... options) throws IOException {
@@ -1477,11 +1477,11 @@ public abstract class AbstractSftpSubsystemHelper
try {
doMakeDirectory(id, path, attrs, IoUtils.getLinkOptions(false));
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_MKDIR, path, attrs);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_MKDIR, path, attrs);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doMakeDirectory(int id, String path, Map<String, ?> attrs, LinkOption... options) throws IOException {
@@ -1526,11 +1526,11 @@ public abstract class AbstractSftpSubsystemHelper
*/
doRemove(id, path, IoUtils.getLinkOptions(false));
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_REMOVE, path);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_REMOVE, path);
return;
}
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
}
protected void doRemove(int id, String path, LinkOption... options) throws IOException {
@@ -2696,6 +2696,8 @@ public abstract class AbstractSftpSubsystemHelper
send(buffer);
}
+ protected abstract Buffer prepareReply(Buffer buffer);
+
protected abstract void send(Buffer buffer) throws IOException;
protected Path resolveNormalizedLocation(String remotePath) throws IOException, InvalidPathException {
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/6bed356a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
----------------------------------------------------------------------
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
index 8979909..ab1794e 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/server/subsystem/sftp/SftpSubsystem.java
@@ -471,7 +471,7 @@ public class SftpSubsystem
* channel.
*/
if (requestsCount > 0L) {
- sendStatus(BufferUtils.clear(buffer), id,
+ sendStatus(prepareReply(buffer), id,
SftpConstants.SSH_FX_FAILURE,
"Version selection not the 1st request for proposal = " + proposed);
session.close(true);
@@ -488,9 +488,9 @@ public class SftpSubsystem
}
if (result) {
version = Integer.parseInt(proposed);
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_OK, "");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_OK, "");
} else {
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_FAILURE, "Unsupported version " + proposed);
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_FAILURE, "Unsupported version " + proposed);
session.close(true);
}
}
@@ -625,7 +625,7 @@ public class SftpSubsystem
try {
DirectoryHandle dh = validateHandle(handle, h, DirectoryHandle.class);
if (dh.isDone()) {
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_EOF, "Directory reading is done");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_EOF, "Directory reading is done");
return;
}
@@ -650,7 +650,7 @@ public class SftpSubsystem
// Send only a few files at a time to not create packets of a too
// large size or have a timeout to occur.
- reply = BufferUtils.clear(buffer);
+ reply = prepareReply(buffer);
reply.putByte((byte) SftpConstants.SSH_FXP_NAME);
reply.putInt(id);
@@ -673,13 +673,13 @@ public class SftpSubsystem
} else {
// empty directory
dh.markDone();
- sendStatus(BufferUtils.clear(buffer), id, SftpConstants.SSH_FX_EOF, "Empty directory");
+ sendStatus(prepareReply(buffer), id, SftpConstants.SSH_FX_EOF, "Empty directory");
return;
}
Objects.requireNonNull(reply, "No reply buffer created");
} catch (IOException | RuntimeException e) {
- sendStatus(BufferUtils.clear(buffer), id, e, SftpConstants.SSH_FXP_READDIR, handle);
+ sendStatus(prepareReply(buffer), id, e, SftpConstants.SSH_FXP_READDIR, handle);
return;
}
@@ -858,7 +858,7 @@ public class SftpSubsystem
extensions.put(name, data);
}
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.putByte((byte) SftpConstants.SSH_FXP_VERSION);
buffer.putInt(version);
@@ -871,6 +871,12 @@ public class SftpSubsystem
}
@Override
+ protected Buffer prepareReply(Buffer buffer) {
+ buffer.clear();
+ return buffer;
+ }
+
+ @Override
protected void send(Buffer buffer) throws IOException {
int len = buffer.available();
BufferUtils.writeInt(out, len, workBuf, 0, workBuf.length);
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/6bed356a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
----------------------------------------------------------------------
diff --git a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
index ac8ed34..1e35b5a 100644
--- a/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
+++ b/sshd-sftp/src/test/java/org/apache/sshd/client/subsystem/sftp/extensions/openssh/helpers/OpenSSHExtensionsTest.java
@@ -151,7 +151,7 @@ public class OpenSSHExtensionsTest extends AbstractSftpClientTestSupport {
throw new StreamCorruptedException("executeExtendedCommand(" + extension + ") previous not null: " + prev);
}
- buffer.clear();
+ buffer = prepareReply(buffer);
buffer.putByte((byte) SftpConstants.SSH_FXP_EXTENDED_REPLY);
buffer.putInt(id);
OpenSSHStatExtensionInfo.encode(buffer, expected);