summaryrefslogtreecommitdiff
path: root/json-glib/json-parser.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2020-08-24 15:53:24 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2020-08-24 17:44:07 +0100
commit1fdaf7ab76c966e0318a62e922c7b7d8507ecc48 (patch)
tree46557087c3ee8ecbba96bd7989fa3a1cef672406 /json-glib/json-parser.c
parent67ce7b204483894fffb7ea6feddcbac00bc1a9bf (diff)
downloadjson-glib-1fdaf7ab76c966e0318a62e922c7b7d8507ecc48.tar.gz
Properly detect multiple top level statements
JSON can only have one top level statement. If we get multiple statements, we should error out appropriately, and we should also avoid leaking the node for the previously parsed statement. Fixes: #45
Diffstat (limited to 'json-glib/json-parser.c')
-rw-r--r--json-glib/json-parser.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c
index 3d77975..4e08848 100644
--- a/json-glib/json-parser.c
+++ b/json-glib/json-parser.c
@@ -122,20 +122,9 @@ json_parser_clear (JsonParser *parser)
{
JsonParserPrivate *priv = parser->priv;
- g_free (priv->variable_name);
- priv->variable_name = NULL;
-
- if (priv->last_error)
- {
- g_error_free (priv->last_error);
- priv->last_error = NULL;
- }
-
- if (priv->root)
- {
- json_node_unref (priv->root);
- priv->root = NULL;
- }
+ g_clear_pointer (&priv->variable_name, g_free);
+ g_clear_pointer (&priv->last_error, g_error_free);
+ g_clear_pointer (&priv->root, json_node_unref);
}
static void
@@ -880,6 +869,14 @@ json_parse_statement (JsonParser *parser,
case G_TOKEN_FLOAT:
case G_TOKEN_STRING:
case G_TOKEN_IDENTIFIER:
+ if (priv->root != NULL)
+ {
+ JSON_NOTE (PARSER, "Only one top level statement is possible");
+ json_scanner_get_next_token (scanner);
+ priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD;
+ return G_TOKEN_EOF;
+ }
+
JSON_NOTE (PARSER, "Statement is a value");
token = json_scanner_get_next_token (scanner);
return json_parse_value (parser, scanner, token, &priv->root);
@@ -888,7 +885,7 @@ json_parse_statement (JsonParser *parser,
JSON_NOTE (PARSER, "Unknown statement");
json_scanner_get_next_token (scanner);
priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD;
- return G_TOKEN_SYMBOL;
+ return priv->root != NULL ? G_TOKEN_EOF : G_TOKEN_SYMBOL;
}
}