Fix parsing of long latin strings in the json parser

Latin1 strings are usually stored as 8 bit data in the json binary
format. But that data structure has a size limitation of 16bit, so
we need to fall back to storing the string as 16 bit data if it is
too long.

Task-number: QTBUG-30946
Change-Id: I0069b1367030b0b2f819fd1f04e34c9e2534a2a3
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
This commit is contained in:
Lars Knoll 2013-05-22 09:53:39 +02:00 committed by The Qt Project
parent d2ec7e05eb
commit 7878eb6ba3
2 changed files with 47 additions and 1 deletions

View File

@ -886,7 +886,8 @@ bool Parser::parseString(bool *latin1)
return false;
}
}
if (ch > 0xff) {
// bail out if the string is not pure latin1 or too long to hold as a latin1string (which has only 16 bit for the length)
if (ch > 0xff || json - start >= 0x8000) {
*latin1 = false;
break;
}

View File

@ -128,6 +128,8 @@ private Q_SLOTS:
void bom();
void nesting();
void longStrings();
private:
QString testDataDir;
};
@ -2118,5 +2120,48 @@ void tst_QtJson::nesting()
}
void tst_QtJson::longStrings()
{
// test around 15 and 16 bit boundaries, as these are limits
// in the data structures (for Latin1String in qjson_p.h)
QString s(0x7ff0, 'a');
for (int i = 0x7ff0; i < 0x8010; i++) {
s.append("c");
QMap <QString, QVariant> map;
map["key"] = s;
/* Create a QJsonDocument from the QMap ... */
QJsonDocument d1 = QJsonDocument::fromVariant(QVariant(map));
/* ... and a QByteArray from the QJsonDocument */
QByteArray a1 = d1.toJson();
/* Create a QJsonDocument from the QByteArray ... */
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
QVERIFY(a1 == a2);
}
s = QString(0xfff0, 'a');
for (int i = 0xfff0; i < 0x10010; i++) {
s.append("c");
QMap <QString, QVariant> map;
map["key"] = s;
/* Create a QJsonDocument from the QMap ... */
QJsonDocument d1 = QJsonDocument::fromVariant(QVariant(map));
/* ... and a QByteArray from the QJsonDocument */
QByteArray a1 = d1.toJson();
/* Create a QJsonDocument from the QByteArray ... */
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
QVERIFY(a1 == a2);
}
}
QTEST_MAIN(tst_QtJson)
#include "tst_qtjson.moc"