Repository: mina-sshd Updated Branches: refs/heads/master 951e8dd53 -> 6a8253d62
Close streams used by ScpHelper in an orderly manner in order to generate an SSH_MSG_CHANNEL_EOF if necessary * See SSHD-580 Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/af4561ad Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/af4561ad Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/af4561ad Branch: refs/heads/master Commit: af4561ad1ad1557c3df27cb5bb2c5cba19ebb260 Parents: 951e8dd Author: Lyor Goldstein <[email protected]> Authored: Thu Jan 21 15:05:50 2016 +0200 Committer: Lyor Goldstein <[email protected]> Committed: Thu Jan 21 15:05:50 2016 +0200 ---------------------------------------------------------------------- .../sshd/client/scp/DefaultScpClient.java | 22 +++++++++++++------- .../sshd/common/channel/AbstractChannel.java | 7 ++++--- .../org/apache/sshd/server/scp/ScpCommand.java | 19 +++++++++++------ 3 files changed, 31 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/af4561ad/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java index e024ff8..1cadea3 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java @@ -77,9 +77,10 @@ public class DefaultScpClient extends AbstractScpClient { String cmd = createReceiveCommand(remote, Collections.<Option>emptyList()); ClientSession session = getClientSession(); ChannelExec channel = openCommandChannel(session, cmd); - try { + try (InputStream invOut = channel.getInvertedOut(); + OutputStream invIn = channel.getInvertedIn()) { // NOTE: we use a mock file system since we expect no invocations for it - ScpHelper helper = new ScpHelper(session, channel.getInvertedOut(), channel.getInvertedIn(), new MockFileSystem(remote), listener); + ScpHelper helper = new ScpHelper(session, invOut, invIn, new MockFileSystem(remote), listener); helper.receiveFileStream(local, ScpHelper.DEFAULT_RECEIVE_BUFFER_SIZE); } finally { channel.close(false); @@ -91,8 +92,9 @@ public class DefaultScpClient extends AbstractScpClient { String cmd = createReceiveCommand(remote, options); ClientSession session = getClientSession(); ChannelExec channel = openCommandChannel(session, cmd); - try { - ScpHelper helper = new ScpHelper(session, channel.getInvertedOut(), channel.getInvertedIn(), fs, listener); + try (InputStream invOut = channel.getInvertedOut(); + OutputStream invIn = channel.getInvertedIn()) { + ScpHelper helper = new ScpHelper(session, invOut, invIn, fs, listener); helper.receive(local, options.contains(Option.Recursive), options.contains(Option.TargetIsDirectory), @@ -112,8 +114,10 @@ public class DefaultScpClient extends AbstractScpClient { final String cmd = createSendCommand(remote, (time != null) ? EnumSet.of(Option.PreserveAttributes) : Collections.<Option>emptySet()); ClientSession session = getClientSession(); ChannelExec channel = openCommandChannel(session, cmd); - try { - ScpHelper helper = new ScpHelper(session, channel.getInvertedOut(), channel.getInvertedIn(), new MockFileSystem(remote), listener); + try (InputStream invOut = channel.getInvertedOut(); + OutputStream invIn = channel.getInvertedIn()) { + // NOTE: we use a mock file system since we expect no invocations for it + ScpHelper helper = new ScpHelper(session, invOut, invIn, new MockFileSystem(remote), listener); final Path mockPath = new MockPath(remote); helper.sendStream(new DefaultScpStreamResolver(name, mockPath, perms, time, size, local, cmd), time != null, ScpHelper.DEFAULT_SEND_BUFFER_SIZE); @@ -137,8 +141,10 @@ public class DefaultScpClient extends AbstractScpClient { FactoryManager manager = session.getFactoryManager(); FileSystemFactory factory = manager.getFileSystemFactory(); FileSystem fs = factory.createFileSystem(session); - try { - ScpHelper helper = new ScpHelper(session, channel.getInvertedOut(), channel.getInvertedIn(), fs, listener); + + try (InputStream invOut = channel.getInvertedOut(); + OutputStream invIn = channel.getInvertedIn()) { + ScpHelper helper = new ScpHelper(session, invOut, invIn, fs, listener); executor.execute(helper, local, options); } finally { try { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/af4561ad/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java ---------------------------------------------------------------------- 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 62caf9f..c46cfe0 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 @@ -580,7 +580,7 @@ public abstract class AbstractChannel // Only accept extended data for stderr if (ex != SshConstants.SSH_EXTENDED_DATA_STDERR) { if (log.isDebugEnabled()) { - log.debug("handleExtendedData({}) send SSH_MSG_CHANNEL_FAILURE - non STDERR type: {}", this, ex); + log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_FAILURE - non STDERR type: {}", this, ex); } Session s = getSession(); buffer = s.prepareBuffer(SshConstants.SSH_MSG_CHANNEL_FAILURE, BufferUtils.clear(buffer)); @@ -589,14 +589,15 @@ public abstract class AbstractChannel return; } int len = buffer.getInt(); - if (len < 0 || len > ByteArrayBuffer.MAX_LEN) { + if ((len < 0) || (len > ByteArrayBuffer.MAX_LEN)) { throw new IllegalStateException("Bad item length: " + len); } if (log.isDebugEnabled()) { log.debug("handleExtendedData({}) SSH_MSG_CHANNEL_EXTENDED_DATA len={}", this, len); } if (log.isTraceEnabled()) { - log.trace("handleExtendedData({}) extended data: {}", this, BufferUtils.printHex(buffer.array(), buffer.rpos(), len)); + log.trace("handleExtendedData({}) extended data: {}", + this, BufferUtils.printHex(buffer.array(), buffer.rpos(), len)); } if (isEofSignalled()) { // TODO consider throwing an exception http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/af4561ad/sshd-core/src/main/java/org/apache/sshd/server/scp/ScpCommand.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/server/scp/ScpCommand.java b/sshd-core/src/main/java/org/apache/sshd/server/scp/ScpCommand.java index bc1dbab..e5b222b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/scp/ScpCommand.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/scp/ScpCommand.java @@ -118,8 +118,10 @@ public class ScpCommand if (log.isDebugEnabled()) { log.debug("Executing command {}", command); } - String[] args = command.split(" "); - for (int i = 1; i < args.length; i++) { + + String[] args = GenericUtils.split(command, ' '); + int numArgs = GenericUtils.length(args); + for (int i = 1; i < numArgs; i++) { String argVal = args[i]; if (argVal.charAt(0) == '-') { for (int j = 1; j < argVal.length(); j++) { @@ -141,16 +143,21 @@ public class ScpCommand optD = true; break; default: // ignored -// error = new IOException("Unsupported option: " + args[i].charAt(j)); -// return; + if (log.isDebugEnabled()) { + log.debug("Unknown flag ('{}') in command={}", option, command); + } } } } else { String prevArg = args[i - 1]; path = command.substring(command.indexOf(prevArg) + prevArg.length() + 1); + + int pathLen = path.length(); + char startDelim = path.charAt(0); + char endDelim = (pathLen > 2) ? path.charAt(pathLen - 1) : '\0'; // remove quotes - if ((path.startsWith("\"") && path.endsWith("\"")) || (path.startsWith("'") && path.endsWith("'"))) { - path = path.substring(1, path.length() - 1); + if ((pathLen > 2) && (startDelim == endDelim) && ((startDelim == '\'') || (startDelim == '"'))) { + path = path.substring(1, pathLen - 1); } break; }
