From 04b20a1a46818b84efbfb11d8cb3c6a8613f608f Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 20 Nov 2018 15:19:32 +0100 Subject: [PATCH] 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 Change-Id: I644ea0737d51d6114facb19a0ad70f10aeb79f2c Reviewed-by: Orgad Shaneh Reviewed-by: Eike Ziller --- src/libs/utils/synchronousprocess.cpp | 8 +++++++- 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 f9ab96eb478..a153e6ac91f 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 78cc6ffcff7..17004b10351 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});