diff options
author | Christian Stenger <christian.stenger@qt.io> | 2018-11-20 15:19:32 +0100 |
---|---|---|
committer | Christian Stenger <christian.stenger@qt.io> | 2018-11-21 14:35:29 +0000 |
commit | 04b20a1a46818b84efbfb11d8cb3c6a8613f608f (patch) | |
tree | 9b4c4ee13166700cb9e26ee7fa97f591ac15e336 | |
parent | c76411a55eeffd620182473d3e2421e6870937f2 (diff) | |
download | qt-creator-04b20a1a46818b84efbfb11d8cb3c6a8613f608f.tar.gz |
Android: Fix uploading file on Windows
Quoting of arguments on Windows behaves differently
depending on the used start() overload of QProcess.
Setting the program and arguments before calling start()
with only the QIODevice::OpenMode parameter allows to
preserve the wanted quoting.
Task-number: QTCREATORBUG-21547
Done-with: Oliver Wolff <oliver.wolff@qt.io>
Change-Id: I644ea0737d51d6114facb19a0ad70f10aeb79f2c
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r-- | src/libs/utils/synchronousprocess.cpp | 8 | ||||
-rw-r--r-- | src/plugins/android/androidrunnerworker.cpp | 2 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp index f9ab96eb47..a153e6ac91 100644 --- a/src/libs/utils/synchronousprocess.cpp +++ b/src/libs/utils/synchronousprocess.cpp @@ -455,7 +455,11 @@ SynchronousProcessResponse SynchronousProcess::run(const QString &binary, // executable cannot be found in the path. Do not start the // event loop in that case. d->m_binary = binary; - d->m_process.start(binary, args, writeData.isEmpty() ? QIODevice::ReadOnly : QIODevice::ReadWrite); + // using QProcess::start() and passing program, args and OpenMode results in a different + // quoting of arguments than using QProcess::setArguments() beforehand and calling start() + // only with the OpenMode + d->m_process.setProgram(binary); + d->m_process.setArguments(args); connect(&d->m_process, &QProcess::started, this, [this, writeData] { if (!writeData.isEmpty()) { int pos = 0; @@ -469,6 +473,8 @@ SynchronousProcessResponse SynchronousProcess::run(const QString &binary, } d->m_process.closeWriteChannel(); }); + d->m_process.start(writeData.isEmpty() ? QIODevice::ReadOnly : QIODevice::ReadWrite); + if (!d->m_startFailure) { d->m_timer.start(); if (isGuiThread()) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 78cc6ffcff..17004b1035 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -278,7 +278,7 @@ bool AndroidRunnerWorker::uploadFile(const QString &from, const QString &to, con if (!f.open(QIODevice::ReadOnly)) return false; runAdb({"shell", "run-as", m_packageName, "rm", to}); - auto res = runAdb({"shell", "run-as", m_packageName, "sh", "-c", QString("'cat > %1'").arg(to)}, 60, f.readAll()); + auto res = runAdb({"shell", "run-as", m_packageName, QString("sh -c 'cat > %1'").arg(to)}, 60, f.readAll()); if (!res) return false; return runAdb({"shell", "run-as", m_packageName, "chmod", flags, to}); |