Browse Source

Core: add EOF check for json parser

Additionally reset parse result if error was found.

(cherry picked from commit a2676ff810f2769d010d5c48c7f72b86194bec64)
Sergey Minakov 5 years ago
parent
commit
78837f5c65
1 changed files with 15 additions and 7 deletions
  1. 15 7
      core/io/json.cpp

+ 15 - 7
core/io/json.cpp

@@ -310,7 +310,6 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
 		if (err)
 			return err;
 		value = d;
-		return OK;
 	} else if (token.type == TK_BRACKET_OPEN) {
 
 		Array a;
@@ -318,8 +317,6 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
 		if (err)
 			return err;
 		value = a;
-		return OK;
-
 	} else if (token.type == TK_IDENTIFIER) {
 
 		String id = token.value;
@@ -333,20 +330,18 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
 			r_err_str = "Expected 'true','false' or 'null', got '" + id + "'.";
 			return ERR_PARSE_ERROR;
 		}
-		return OK;
-
 	} else if (token.type == TK_NUMBER) {
 
 		value = token.value;
-		return OK;
 	} else if (token.type == TK_STRING) {
 
 		value = token.value;
-		return OK;
 	} else {
 		r_err_str = "Expected value, got " + String(tk_name[token.type]) + ".";
 		return ERR_PARSE_ERROR;
 	}
+
+	return OK;
 }
 
 Error JSON::_parse_array(Array &array, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str) {
@@ -473,5 +468,18 @@ Error JSON::parse(const String &p_json, Variant &r_ret, String &r_err_str, int &
 
 	err = _parse_value(r_ret, token, str, idx, len, r_err_line, r_err_str);
 
+	// Check if EOF is reached
+	// or it's a type of the next token.
+	if (err == OK && idx < len) {
+		err = _get_token(str, idx, len, token, r_err_line, r_err_str);
+
+		if (err || token.type != TK_EOF) {
+			r_err_str = "Expected 'EOF'";
+			// Reset return value to empty `Variant`
+			r_ret = Variant();
+			return ERR_PARSE_ERROR;
+		}
+	}
+
 	return err;
 }