From 323b97ccaea7b9442fa1bcb01514e0c5a4a97fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Tue, 26 Oct 2021 13:34:38 +0200 Subject: QHash: avoid crashing when reserving on a shared hash Pick-to: 6.2 Change-Id: I21ad13fa223bd5a2c61112e790965093a2750268 Reviewed-by: Timur Pocheptsov Reviewed-by: Qt CI Bot Reviewed-by: Thiago Macieira --- src/corelib/tools/qhash.h | 3 ++- tests/auto/corelib/tools/qhash/tst_qhash.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index ecbdfe4fb8..49c9ce1d41 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -500,8 +500,9 @@ struct Data bool resized = numBuckets != other.numBuckets; size_t nSpans = (numBuckets + Span::LocalBucketMask) / Span::NEntries; spans = new Span[nSpans]; + size_t otherNSpans = (other.numBuckets + Span::LocalBucketMask) / Span::NEntries; - for (size_t s = 0; s < nSpans; ++s) { + for (size_t s = 0; s < otherNSpans; ++s) { const Span &span = other.spans[s]; for (size_t index = 0; index < Span::NEntries; ++index) { if (!span.hasNode(index)) diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index 3c873d093e..576a1c6107 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -93,6 +93,8 @@ private slots: void removeInEmptyHash(); void valueInEmptyHash(); void fineTuningInEmptyHash(); + + void reserveShared(); }; struct IdentityTracker { @@ -2598,5 +2600,20 @@ void tst_QHash::fineTuningInEmptyHash() QVERIFY(hash.capacity() > 0); } +void tst_QHash::reserveShared() +{ + QHash hash; + hash.insert('c', 'c'); + auto hash2 = hash; + + QCOMPARE(hash2.capacity(), hash.capacity()); + auto oldCap = hash.capacity(); + + hash2.reserve(100); // This shouldn't crash + + QVERIFY(hash2.capacity() >= 100); + QCOMPARE(hash.capacity(), oldCap); +} + QTEST_APPLESS_MAIN(tst_QHash) #include "tst_qhash.moc" -- cgit v1.2.3