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;
             }

Reply via email to