Don't accept json strings with trailing garbage

A well formed JSON document is not allowed to contain
trailing garbage at the end. Don't accept this in the
parser.

Task-number: QTBUG-40062
Change-Id: I0a09dbd099a8c643f58023342546c4e67d026fec
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
bb10
Lars Knoll 2014-09-05 13:26:16 +02:00
parent 853845a4a2
commit df25927a68
3 changed files with 28 additions and 1 deletions

View File

@ -68,7 +68,8 @@ struct Q_CORE_EXPORT QJsonParseError
UnterminatedString,
MissingObject,
DeepNesting,
DocumentTooLarge
DocumentTooLarge,
GarbageAtEnd
};
QString errorString() const;

View File

@ -79,6 +79,7 @@ QT_BEGIN_NAMESPACE
#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma")
#define JSONERR_DEEP_NEST QT_TRANSLATE_NOOP("QJsonParseError", "too deeply nested document")
#define JSONERR_DOC_LARGE QT_TRANSLATE_NOOP("QJsonParseError", "too large document")
#define JSONERR_GARBAGEEND QT_TRANSLATE_NOOP("QJsonParseError", "garbage at the end of the document")
/*!
\class QJsonParseError
@ -111,6 +112,8 @@ QT_BEGIN_NAMESPACE
\value MissingObject An object was expected but couldn't be found
\value DeepNesting The JSON document is too deeply nested for the parser to parse it
\value DocumentTooLarge The JSON document is too large for the parser to parse it
\value GarbageAtEnd The parsed document contains additional garbage characters at the end
*/
/*!
@ -182,6 +185,9 @@ QString QJsonParseError::errorString() const
case DocumentTooLarge:
sz = JSONERR_DOC_LARGE;
break;
case GarbageAtEnd:
sz = JSONERR_GARBAGEEND;
break;
}
#ifndef QT_BOOTSTRAPPED
return QCoreApplication::translate("QJsonParseError", sz);
@ -323,6 +329,12 @@ QJsonDocument Parser::parse(QJsonParseError *error)
goto error;
}
eatSpace();
if (json < end) {
lastError = QJsonParseError::GarbageAtEnd;
goto error;
}
END;
{
if (error) {

View File

@ -151,6 +151,7 @@ private Q_SLOTS:
void objectInitializerList();
void unicodeKeys();
void garbageAtEnd();
private:
QString testDataDir;
};
@ -2777,5 +2778,18 @@ void tst_QtJson::unicodeKeys()
}
}
void tst_QtJson::garbageAtEnd()
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson("{},", &error);
QVERIFY(error.error == QJsonParseError::GarbageAtEnd);
QVERIFY(error.offset == 2);
QVERIFY(doc.isEmpty());
doc = QJsonDocument::fromJson("{} ", &error);
QVERIFY(error.error == QJsonParseError::NoError);
QVERIFY(!doc.isEmpty());
}
QTEST_MAIN(tst_QtJson)
#include "tst_qtjson.moc"