summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2014-05-18 18:45:42 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-23 08:24:47 +0200
commitd2220eba8b57abba04f9bcd043fdd86eef7d60e3 (patch)
treea01edaae2f266453b3f4efbd6aa09e755c988793
parent4e9853139ca04858f1639e0fba6b8caf57474f29 (diff)
downloadqtbase-release.tar.gz
Android: Fix crash caused by unintentionally modification of env data.release
The data given to putenv(3) becomes a part of the environment, as described in SUSv2, so If the data is unintentionally modified or deleted the consequence can be fatal. In previous versions of Android, the putenv(3) implementation made a copy of the data, so this bug has gone unnoticed. Task-number: QTBUG-39042 Change-Id: I337c483f3927eb35188798ab349cd722999afae9 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index ff1a40bfc5..0b1a9e2e2d 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -463,17 +463,19 @@ static void *startMainMethod(void */*data*/)
static jboolean startQtApplication(JNIEnv *env, jobject /*object*/, jstring paramsString, jstring environmentString)
{
m_mainLibraryHnd = NULL;
- const char *nativeString = env->GetStringUTFChars(environmentString, 0);
- QByteArray string = nativeString;
- env->ReleaseStringUTFChars(environmentString, nativeString);
- m_applicationParams=string.split('\t');
- foreach (string, m_applicationParams) {
- if (!string.isEmpty() && putenv(string.constData()))
- qWarning() << "Can't set environment" << string;
+ { // Set env. vars
+ const char *nativeString = env->GetStringUTFChars(environmentString, 0);
+ const QList<QByteArray> envVars = QByteArray(nativeString).split('\t');
+ env->ReleaseStringUTFChars(environmentString, nativeString);
+ foreach (const QByteArray &envVar, envVars) {
+ const QList<QByteArray> envVarPair = envVar.split('=');
+ if (envVarPair.size() == 2 && ::setenv(envVarPair[0], envVarPair[1], 1) != 0)
+ qWarning() << "Can't set environment" << envVarPair;
+ }
}
- nativeString = env->GetStringUTFChars(paramsString, 0);
- string = nativeString;
+ const char *nativeString = env->GetStringUTFChars(paramsString, 0);
+ QByteArray string = nativeString;
env->ReleaseStringUTFChars(paramsString, nativeString);
m_applicationParams=string.split('\t');