aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-06-14 13:37:20 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2019-06-14 12:18:48 +0000
commitacfe45c4348e9db30c3db682cf0863f38a5094cb (patch)
tree341b0b808e3f69c44e2a9834d1044593fa5f6f7a
parentcd8ebb21e3445dd1b02f3401cd3c223e14c45c26 (diff)
SSH: Fix running remote process in terminal
ConsoleProcess stumbles over the special characters in the remote command and as a result silently runs the command locally instead. Prevent that. We can (and should) simply leave these characters alone, as they have no special meaning on the local machine. Change-Id: I31b3afe1cf170e51d431372b15f4df3656006959 Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/libs/utils/consoleprocess.h4
-rw-r--r--src/libs/utils/consoleprocess_unix.cpp5
-rw-r--r--src/libs/utils/consoleprocess_win.cpp4
-rw-r--r--src/libs/utils/qtcprocess.cpp4
-rw-r--r--src/libs/utils/qtcprocess.h3
-rw-r--r--src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp3
6 files changed, 15 insertions, 8 deletions
diff --git a/src/libs/utils/consoleprocess.h b/src/libs/utils/consoleprocess.h
index 28be67f0bf..82d0a5d8bb 100644
--- a/src/libs/utils/consoleprocess.h
+++ b/src/libs/utils/consoleprocess.h
@@ -70,7 +70,9 @@ public:
QProcess::ProcessError error() const;
QString errorString() const;
- bool start(const QString &program, const QString &args);
+ enum class MetaCharMode { Abort, Ignore };
+ bool start(const QString &program, const QString &args,
+ MetaCharMode metaCharMode = MetaCharMode::Ignore);
public slots:
void stop();
diff --git a/src/libs/utils/consoleprocess_unix.cpp b/src/libs/utils/consoleprocess_unix.cpp
index 53a8c95848..43afffa0a2 100644
--- a/src/libs/utils/consoleprocess_unix.cpp
+++ b/src/libs/utils/consoleprocess_unix.cpp
@@ -65,7 +65,7 @@ void ConsoleProcess::setSettings(QSettings *settings)
d->m_settings = settings;
}
-bool ConsoleProcess::start(const QString &program, const QString &args)
+bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode)
{
if (isRunning())
return false;
@@ -75,7 +75,8 @@ bool ConsoleProcess::start(const QString &program, const QString &args)
QtcProcess::SplitError perr;
QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(),
- &d->m_environment, &d->m_workingDir);
+ &d->m_environment, &d->m_workingDir,
+ metaCharMode == MetaCharMode::Abort);
QString pcmd;
if (perr == QtcProcess::SplitOk) {
pcmd = program;
diff --git a/src/libs/utils/consoleprocess_win.cpp b/src/libs/utils/consoleprocess_win.cpp
index 2a68ddaba8..be65c42cc8 100644
--- a/src/libs/utils/consoleprocess_win.cpp
+++ b/src/libs/utils/consoleprocess_win.cpp
@@ -51,8 +51,10 @@ qint64 ConsoleProcess::applicationMainThreadID() const
return d->m_appMainThreadId;
}
-bool ConsoleProcess::start(const QString &program, const QString &args)
+bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode)
{
+ Q_UNUSED(metaCharMode);
+
if (isRunning())
return false;
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index d05746d5b1..992e1817c0 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -595,12 +595,12 @@ static QString quoteArgWin(const QString &arg)
}
QtcProcess::Arguments QtcProcess::prepareArgs(const QString &cmd, SplitError *err, OsType osType,
- const Environment *env, const QString *pwd)
+ const Environment *env, const QString *pwd, bool abortOnMeta)
{
if (osType == OsTypeWindows)
return prepareArgsWin(cmd, err, env, pwd);
else
- return Arguments::createUnixArgs(splitArgs(cmd, osType, true, err, env, pwd));
+ return Arguments::createUnixArgs(splitArgs(cmd, osType, abortOnMeta, err, env, pwd));
}
diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h
index d3d22d3415..5eeacf666e 100644
--- a/src/libs/utils/qtcprocess.h
+++ b/src/libs/utils/qtcprocess.h
@@ -79,7 +79,8 @@ public:
//! Prepare argument of a shell command for feeding into QProcess
static Arguments prepareArgs(const QString &cmd, SplitError *err,
OsType osType = HostOsInfo::hostOs(),
- const Environment *env = nullptr, const QString *pwd = nullptr);
+ const Environment *env = nullptr, const QString *pwd = nullptr,
+ bool abortOnMeta = true);
//! Prepare a shell command for feeding into QProcess
static bool prepareCommand(const QString &command, const QString &arguments,
QString *outCmd, Arguments *outArgs, OsType osType = HostOsInfo::hostOs(),
diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
index 030e4057a3..7e8be72c65 100644
--- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
+++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
@@ -201,7 +201,8 @@ void SshDeviceProcess::handleConnected()
this, &SshDeviceProcess::handleProcessStarted);
connect(&d->consoleProcess, &ConsoleProcess::stubStopped,
this, [this] { handleProcessFinished(d->consoleProcess.errorString()); });
- d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' '));
+ d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' '),
+ ConsoleProcess::MetaCharMode::Ignore);
} else {
connect(d->process.get(), &QSsh::SshRemoteProcess::started,
this, &SshDeviceProcess::handleProcessStarted);