diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-01-21 11:33:51 -0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-02-03 11:31:38 +0000 |
commit | 41830b812e5883ff7b98fa1f5779df4648738829 (patch) | |
tree | b41cf28612c13ebb97d17a5a93aefe8e68ce4532 | |
parent | b9f9357c27714acc23257c726b886539f49c0988 (diff) |
QJsonObject::take: add missing detach() call
We were modifying shared objects.
Fixes: QTBUG-89625
Change-Id: Id6bc735b79cf4beb9454fffd165c56476a5dec04
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
(cherry picked from commit 00b759a8d06dbec42232b1b8748c0725da7ced00)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/corelib/serialization/qjsonobject.cpp | 1 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/json/tst_qtjson.cpp | 19 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp index fcac647784..fa26011159 100644 --- a/src/corelib/serialization/qjsonobject.cpp +++ b/src/corelib/serialization/qjsonobject.cpp @@ -634,6 +634,7 @@ QJsonValue QJsonObject::takeImpl(T key) if (!keyExists) return QJsonValue(QJsonValue::Undefined); + detach(); const QJsonValue v = QJsonPrivate::Value::fromTrustedCbor(o->extractAt(index + 1)); removeAt(index / 2); return v; diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index a03eca7234..3e58dd03cc 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -54,6 +54,7 @@ private Q_SLOTS: void testNumbers_4(); void testObjectSimple(); + void testObjectTakeDetach(); void testObjectSmallKeys(); void testObjectInsertCopies(); void testArraySimple(); @@ -523,6 +524,24 @@ void tst_QtJson::testObjectSimple() QCOMPARE(subvalue.toObject(), subobject); } +void tst_QtJson::testObjectTakeDetach() +{ + QJsonObject object1, object2; + object1["key1"] = 1; + object1["key2"] = 2; + object2 = object1; + + object1.take("key2"); + object1.remove("key1"); + QVERIFY(!object1.contains("key1")); + QVERIFY(object2.contains("key1")); + QVERIFY(object2.value("key1").isDouble()); + + QVERIFY(!object1.contains("key2")); + QVERIFY(object2.contains("key2")); + QVERIFY(object2.value("key2").isDouble()); +} + void tst_QtJson::testObjectSmallKeys() { QJsonObject data1; |