summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-09-27 17:15:50 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-09-29 16:27:37 +0000
commitdd0f67764c9a33256b84a6a66a9397523e2e2596 (patch)
tree11a4495cef3745225cc3791353fbbf2766ab7531
parent3674e2745dd3972f3e1e5a5e5fc708d0c6570861 (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.cpp5
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++) {