summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Dzyubenko <denis.dzyubenko@nokia.com>2012-01-11 15:13:30 +0100
committerDenis Dzyubenko <denis.dzyubenko@nokia.com>2012-01-11 18:15:02 +0100
commit163726cf946bcf519bf17ab747c04363e056041e (patch)
tree3d46390882dbfeb4c41dc7fe2503bbba701c4332
parent763d19bd197e9c74f9b7775f22abf73b7786eeef (diff)
Fixed object validation in a boundary case
When a latin1 string stored that has only 2 characters or less, the size of the data is 2+2 (2 bytes for the string length and 2 bytes for the content), so it is quite possible that the table is located right after the data. It should be safe to check offset+sizeof(uit) > tableOffset even for shorter strings because values and table is always aligned, hence even for an empty string, it will take 4 bytes. Change-Id: I859ae0be46ebab38feeaa6aa22fbc31f2f95d443 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
-rw-r--r--src/qjson.cpp2
-rw-r--r--tests/auto/test2.json1
-rw-r--r--tests/auto/tst_qtjson.cpp32
3 files changed, 32 insertions, 3 deletions
diff --git a/src/qjson.cpp b/src/qjson.cpp
index 5936949..41d0144 100644
--- a/src/qjson.cpp
+++ b/src/qjson.cpp
@@ -270,7 +270,7 @@ bool Value::isValid(const Base *b) const
if (!offset)
return true;
- if (offset + sizeof(uint) >= b->tableOffset)
+ if (offset + sizeof(uint) > b->tableOffset)
return false;
int s = usedStorage(b);
diff --git a/tests/auto/test2.json b/tests/auto/test2.json
new file mode 100644
index 0000000..303f879
--- /dev/null
+++ b/tests/auto/test2.json
@@ -0,0 +1 @@
+{ "foo": ["ab"] }
diff --git a/tests/auto/tst_qtjson.cpp b/tests/auto/tst_qtjson.cpp
index 70dfa74..4a749ec 100644
--- a/tests/auto/tst_qtjson.cpp
+++ b/tests/auto/tst_qtjson.cpp
@@ -89,6 +89,8 @@ private Q_SLOTS:
void toJson();
void fromJson();
void fromBinary();
+ void toAndFromBinary_data();
+ void toAndFromBinary();
void parseNumbers();
void parseStrings();
void testParser();
@@ -469,7 +471,9 @@ void TestQtJson::testObjectNestedEmpty()
QJsonDocument(object).toBinaryData();
QVERIFY(object.value("inner").toObject().isEmpty());
QVERIFY(object.value("inner2").toObject().isEmpty());
- QJsonObject reconstituted(QJsonDocument::fromBinaryData(QJsonDocument(object).toBinaryData()).object());
+ QJsonDocument doc = QJsonDocument::fromBinaryData(QJsonDocument(object).toBinaryData());
+ QVERIFY(doc.isValid());
+ QJsonObject reconstituted(doc.object());
QCOMPARE(reconstituted.value("inner").toObject().size(), 0);
QCOMPARE(reconstituted.value("inner").type(), QJsonValue::Object);
QCOMPARE(reconstituted.value("inner2").type(), QJsonValue::Object);
@@ -1013,17 +1017,41 @@ void TestQtJson::fromBinary()
QByteArray testJson = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(testJson);
+ QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
+ QVERIFY(outdoc.isValid());
+ QVERIFY(doc == outdoc);
QFile bfile(QLatin1String("test.bjson"));
bfile.open(QFile::ReadOnly);
QByteArray binary = bfile.readAll();
QJsonDocument bdoc = QJsonDocument::fromBinaryData(binary);
-
+ QVERIFY(bdoc.isValid());
QVERIFY(doc.toVariant() == bdoc.toVariant());
QVERIFY(doc == bdoc);
}
+void TestQtJson::toAndFromBinary_data()
+{
+ QTest::addColumn<QString>("filename");
+ QTest::newRow("test.json") << QString::fromLatin1("test.json");
+ QTest::newRow("test2.json") << QString::fromLatin1("test2.json");
+}
+
+void TestQtJson::toAndFromBinary()
+{
+ QFETCH(QString, filename);
+ QFile file(filename);
+ QVERIFY(file.open(QFile::ReadOnly));
+ QByteArray data = file.readAll();
+
+ QJsonDocument doc = QJsonDocument::fromJson(data);
+ QVERIFY(doc.isValid());
+ QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
+ QVERIFY(outdoc.isValid());
+ QVERIFY(doc == outdoc);
+}
+
void TestQtJson::parseNumbers()
{
{