diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-09-27 17:15:50 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-09-29 16:27:37 +0000 |
commit | dd0f67764c9a33256b84a6a66a9397523e2e2596 (patch) | |
tree | 11a4495cef3745225cc3791353fbbf2766ab7531 | |
parent | 3674e2745dd3972f3e1e5a5e5fc708d0c6570861 (diff) |
Android: fix null array when requesting available providers
When requesting available positioning providers, the Java side can
return new int[0];
in some cases. This is a perfectly valid way to return a zero-length
array in Java.
However, according to the linked bugreport, some JNI implementations
seem to convert it into nullptr, which later causes a crash when
passing a nullptr to GetIntArrayElements() JNI method.
Guard against it by explicitly checking that the array received from
the Java side is not nullptr.
Fixes: QTBUG-116645
Pick-to: 6.2
Change-Id: I657570ec5b0c62b994ed7d56c8142ab8992339b7
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit 6148ae00cabca48def860970b48b2cb5dccdfff0)
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
(cherry picked from commit b6789681496d7716cc8cf1b2cca8d6a4dd410800)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/position/android/src/jnipositioning.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp index 9c2a7c7c..8025c2ff 100644 --- a/src/plugins/position/android/src/jnipositioning.cpp +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -191,6 +191,11 @@ namespace AndroidPositioning { QJniObject jniProvidersObj = QJniObject::callStaticMethod<jobject>(positioningClass(), providerListMethodId); jintArray jProviders = jniProvidersObj.object<jintArray>(); + if (!jProviders) { + // Work-around for QTBUG-116645 + __android_log_print(ANDROID_LOG_INFO, logTag, "Got null providers array!"); + return ret; + } jint *providers = env->GetIntArrayElements(jProviders, nullptr); const int size = env->GetArrayLength(jProviders); for (int i = 0; i < size; i++) { |