summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2016-04-28 09:58:12 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2016-04-29 08:03:31 +0000
commit0afcd2efe2c33bbbd5d9b1edc47b0fcccb6ce8c2 (patch)
tree89954d31c7fa3d2366c3e7a24574370bd24d9016
parent482bbba7646cfb6aac995be7a2cae03a3b57c0e2 (diff)
Fix crash when requerying product before previous completed
If a product was queried twice in a row, so quickly that the first one was still pending when the second query was made, then we would have unexpected null pointers in the array of identifiers that we pass into Java. This would cause a crash. Instead, we remove all identifiers which are already pending before creating the array so that it will not have any holes. Task-number: QTBUG-52330 Change-Id: I643835ea224dac969d29ad6572f224a068724d41 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r--src/purchasing/inapppurchase/android/qandroidinapppurchasebackend.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/purchasing/inapppurchase/android/qandroidinapppurchasebackend.cpp b/src/purchasing/inapppurchase/android/qandroidinapppurchasebackend.cpp
index 2ad605a..0a0a5d1 100644
--- a/src/purchasing/inapppurchase/android/qandroidinapppurchasebackend.cpp
+++ b/src/purchasing/inapppurchase/android/qandroidinapppurchasebackend.cpp
@@ -118,10 +118,7 @@ void QAndroidInAppPurchaseBackend::queryProducts(const QList<Product> &products)
QMutexLocker locker(&m_mutex);
QAndroidJniEnvironment environment;
- jclass cls = environment->FindClass("java/lang/String");
- jobjectArray productIds = environment->NewObjectArray(products.size(), cls, 0);
- environment->DeleteLocalRef(cls);
-
+ QStringList newProducts;
for (int i = 0; i < products.size(); ++i) {
const Product &product = products.at(i);
if (m_productTypeForPendingId.contains(product.identifier)) {
@@ -130,8 +127,18 @@ void QAndroidInAppPurchaseBackend::queryProducts(const QList<Product> &products)
}
m_productTypeForPendingId[product.identifier] = product.productType;
+ newProducts.append(product.identifier);
+ }
+
+ if (newProducts.isEmpty())
+ return;
+
+ jclass cls = environment->FindClass("java/lang/String");
+ jobjectArray productIds = environment->NewObjectArray(newProducts.size(), cls, 0);
+ environment->DeleteLocalRef(cls);
- QAndroidJniObject identifier = QAndroidJniObject::fromString(product.identifier);
+ for (int i = 0; i < newProducts.size(); ++i) {
+ QAndroidJniObject identifier = QAndroidJniObject::fromString(newProducts.at(i));
environment->SetObjectArrayElement(productIds, i, identifier.object());
}