summaryrefslogtreecommitdiffstats
path: root/src/corelib/json/qjsonparser.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2016-11-11 17:06:19 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-11-15 14:19:23 +0000
commite133f0cca44181005f19d006d6c896abe59c1b33 (patch)
tree1620a9d8129a9e735d023a195601e8bd1f0dd99b /src/corelib/json/qjsonparser.cpp
parent71d21ed500a20f3fbabb000243cef1168893c9d5 (diff)
Improve error offset in JSON parsing
Do not consume white-space after a token before the token has been parsed, otherwise we end up with misleading offsets. This also fixes a wrong error of illegal number in several cases. Change-Id: I492ca4de0346a1d0ab73b1c23d7a72dba812664c Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'src/corelib/json/qjsonparser.cpp')
-rw-r--r--src/corelib/json/qjsonparser.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index 094cb7a76b..0eb0d21ecf 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -283,7 +283,6 @@ char Parser::nextToken()
case ValueSeparator:
case EndArray:
case EndObject:
- eatSpace();
case Quote:
break;
default:
@@ -469,6 +468,10 @@ bool Parser::parseMember(int baseOffset)
lastError = QJsonParseError::MissingNameSeparator;
return false;
}
+ if (!eatSpace()) {
+ lastError = QJsonParseError::UnterminatedObject;
+ return false;
+ }
QJsonPrivate::Value val;
if (!parseValue(&val, baseOffset))
return false;
@@ -544,6 +547,10 @@ bool Parser::parseArray()
nextToken();
} else {
while (1) {
+ if (!eatSpace()) {
+ lastError = QJsonParseError::UnterminatedArray;
+ return false;
+ }
QJsonPrivate::Value val;
if (!parseValue(&val, arrayOffset))
return false;
@@ -686,6 +693,12 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
DEBUG << "value: object";
END;
return true;
+ case ValueSeparator:
+ // Essentially missing value, but after a colon, not after a comma
+ // like the other MissingObject errors.
+ lastError = QJsonParseError::IllegalValue;
+ return false;
+ case EndObject:
case EndArray:
lastError = QJsonParseError::MissingObject;
return false;