From dc48e368fe6973d4fd6170735676aff9085c6105 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Wed, 7 Jul 2021 14:51:36 +0200 Subject: [PATCH] QMultiHash::find - prevent detaching shared null Do not detach when find(key, value) is called on an empty QMultiHash. As a drive-by: fix return value for QMultiHash::remove() in case of empty QMultiHash. Task-number: QTBUG-91736 Change-Id: I1e32f359e7ee9ce8403dae79d02e0b88a20ec4a5 Reviewed-by: Edward Welbourne Reviewed-by: Lars Knoll (cherry picked from commit 82499f81478032911d8f788aa28e8d780b31c973) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/tools/qhash.h | 4 +++- tests/auto/corelib/tools/qhash/tst_qhash.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 1a793e61636..bfa2da6dbd4 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -1782,7 +1782,7 @@ public: qsizetype remove(const Key &key, const T &value) { if (isEmpty()) // prevents detaching shared null - return false; + return 0; detach(); auto it = d->find(key); @@ -1844,6 +1844,8 @@ public: iterator find(const Key &key, const T &value) { + if (isEmpty()) + return end(); detach(); auto it = constFind(key, value); return iterator(it.i, it.e); diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index 6ad7d15c771..375f9048c07 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -668,12 +668,17 @@ void tst_QHash::empty() //copied from tst_QMap void tst_QHash::find() { + const QHash constEmptyHash; + QVERIFY(constEmptyHash.find(1) == constEmptyHash.end()); + QVERIFY(!constEmptyHash.isDetached()); + QHash map1; QString testString="Teststring %0"; QString compareString; int i,count=0; QVERIFY(map1.find(1) == map1.end()); + QVERIFY(!map1.isDetached()); map1.insert(1,"Mensch"); map1.insert(1,"Mayer"); @@ -682,6 +687,16 @@ void tst_QHash::find() QCOMPARE(map1.find(1).value(), QLatin1String("Mayer")); QCOMPARE(map1.find(2).value(), QLatin1String("Hej")); + const QMultiHash constEmptyMultiHash; + QVERIFY(constEmptyMultiHash.find(1) == constEmptyMultiHash.cend()); + QVERIFY(constEmptyMultiHash.find(1, "value") == constEmptyMultiHash.cend()); + QVERIFY(!constEmptyMultiHash.isDetached()); + + QMultiHash emptyMultiHash; + QVERIFY(emptyMultiHash.find(1) == emptyMultiHash.end()); + QVERIFY(emptyMultiHash.find(1, "value") == emptyMultiHash.end()); + QVERIFY(!emptyMultiHash.isDetached()); + QMultiHash multiMap(map1); for (i = 3; i < 10; ++i) { compareString = testString.arg(i);