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:
parent
d2ec7e05eb
commit
7878eb6ba3
@ -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;
|
||||
}
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user