diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2016-04-28 09:58:12 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2016-04-29 08:03:31 +0000 |
commit | 0afcd2efe2c33bbbd5d9b1edc47b0fcccb6ce8c2 (patch) | |
tree | 89954d31c7fa3d2366c3e7a24574370bd24d9016 | |
parent | 482bbba7646cfb6aac995be7a2cae03a3b57c0e2 (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.cpp | 17 |
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()); } |