From edc024e826d41a98cb7779e9834e83d7ea5da171 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Wed, 10 Aug 2022 00:02:59 +0300 Subject: [PATCH] Android: handle quoted args passed to an app Currently, arguments passed to the app through applicationArguments extra bundle treat every space as an argument separator. This then doesn't handle the case where an argument is a space separated quoted multi-word. This is more apparent when androidtestrunner is passing test arguments to the app where an argument can be a test case with a data tag that contains a space, which then is treated as two separate tag names. This change makes sure that androidtestrunner quotes each argument, and the app doesn't split the arguments list by spaces, but rather passed the argument string directly to c++ where QProcess::splitCommand() is used to get the correct set of arguments that will be passed to main(). Pick-to: 6.4 6.3 6.2 Task-number: QTBUG-104730 Change-Id: I45d8ca979d90f2a383c84623f0eb2eec29bba727 Reviewed-by: Dimitrios Apostolou Reviewed-by: Ville Voutilainen --- .../qtproject/qt/android/bindings/QtLoader.java | 2 +- src/plugins/platforms/android/androidjnimain.cpp | 7 ++++--- src/tools/androidtestrunner/main.cpp | 15 +++++++++------ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java index 66ba029acea..71595fb9fd2 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java +++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java @@ -399,7 +399,7 @@ public abstract class QtLoader { } if (appParams != null) - loaderParams.putString(APPLICATION_PARAMETERS_KEY, appParams.replace(' ', '\t').trim()); + loaderParams.putString(APPLICATION_PARAMETERS_KEY, appParams); loadApplication(loaderParams); return; diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 3b5e6566304..fee7c438e51 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -445,11 +446,11 @@ static jboolean startQtAndroidPlugin(JNIEnv *env, jobject /*object*/, jstring pa m_mainLibraryHnd = nullptr; const char *nativeString = env->GetStringUTFChars(paramsString, 0); - QByteArray string = nativeString; + const QStringList argsList = QProcess::splitCommand(QString::fromUtf8(nativeString)); env->ReleaseStringUTFChars(paramsString, nativeString); - for (auto str : string.split('\t')) - m_applicationParams.append(str.split(' ')); + for (const QString &arg : argsList) + m_applicationParams.append(arg.toUtf8()); // Go home QDir::setCurrent(QDir::homePath()); diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index 489560a3e09..a5e249affc1 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -313,7 +313,7 @@ static bool parseTestArgs() QString file; QString logType; - QString unhandledArgs; + QStringList unhandledArgs; for (int i = 0; i < g_options.testArgsList.size(); ++i) { const QString &arg = g_options.testArgsList[i].trimmed(); if (arg == QStringLiteral("--")) @@ -335,7 +335,7 @@ static bool parseTestArgs() if (match.hasMatch()) { logType = match.capturedTexts().at(1); } else { - unhandledArgs += QStringLiteral(" %1").arg(arg); + unhandledArgs << QStringLiteral(" \\\"%1\\\"").arg(arg); } } } @@ -345,10 +345,13 @@ static bool parseTestArgs() for (const auto &format : g_options.outFiles.keys()) g_options.testArgs += QStringLiteral(" -o output.%1,%1").arg(format); - g_options.testArgs += unhandledArgs; - g_options.testArgs = QStringLiteral("shell am start -e applicationArguments \\\"%1\\\" -n %2/%3").arg(shellQuote(g_options.testArgs.trimmed()), - g_options.package, - g_options.activity); + g_options.testArgs += unhandledArgs.join(u' '); + + g_options.testArgs = QStringLiteral("shell am start -e applicationArguments \"%1\" -n %2/%3") + .arg(shellQuote(g_options.testArgs.trimmed())) + .arg(g_options.package) + .arg(g_options.activity); + return true; }