summaryrefslogtreecommitdiff
path: root/json-glib/json-parser.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2009-06-28 23:49:51 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2009-06-28 23:49:51 +0100
commit112a8ec8dfd9c46304008b62e8ab256ed7714644 (patch)
tree657e107778f2d610764f916383e9a96ab98d0a5b /json-glib/json-parser.c
parent4ecdd6bedb7961f3a33971aa1f2338115a60f7f3 (diff)
downloadjson-glib-112a8ec8dfd9c46304008b62e8ab256ed7714644.tar.gz
[parser] Advance the tokenizer to avoid an infinite loop
The tokenizer is not advanced when we peek a base value and return. This causes an endless loop which terminates only if the OOM killer in the kernel gets the right process. Thanks to Thomas Weidner for catching and reporting the issue.
Diffstat (limited to 'json-glib/json-parser.c')
-rw-r--r--json-glib/json-parser.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c
index 9765cbe..1da6951 100644
--- a/json-glib/json-parser.c
+++ b/json-glib/json-parser.c
@@ -77,10 +77,10 @@ static const struct
guint name_offset;
guint token;
} symbols[] = {
- { 0, JSON_TOKEN_TRUE },
+ { 0, JSON_TOKEN_TRUE },
{ 5, JSON_TOKEN_FALSE },
- { 11, JSON_TOKEN_NULL },
- { 16, JSON_TOKEN_VAR }
+ { 11, JSON_TOKEN_NULL },
+ { 16, JSON_TOKEN_VAR }
};
static const guint n_symbols = G_N_ELEMENTS (symbols);
@@ -755,8 +755,8 @@ json_parse_object (JsonParser *parser,
}
static guint
-json_parse_statement (JsonParser *parser,
- JsonScanner *scanner)
+json_parse_statement (JsonParser *parser,
+ JsonScanner *scanner)
{
JsonParserPrivate *priv = parser->priv;
guint token;
@@ -816,6 +816,7 @@ json_parse_statement (JsonParser *parser,
case JSON_TOKEN_NULL:
priv->root = priv->current_node = json_node_new (JSON_NODE_NULL);
+ json_scanner_get_next_token (scanner);
return G_TOKEN_NONE;
case JSON_TOKEN_TRUE:
@@ -823,6 +824,7 @@ json_parse_statement (JsonParser *parser,
priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
json_node_set_boolean (priv->current_node,
token == JSON_TOKEN_TRUE ? TRUE : FALSE);
+ json_scanner_get_next_token (scanner);
return G_TOKEN_NONE;
case '-':
@@ -851,6 +853,7 @@ json_parse_statement (JsonParser *parser,
return G_TOKEN_INT;
}
+ json_scanner_get_next_token (scanner);
return G_TOKEN_NONE;
}
else
@@ -862,12 +865,15 @@ json_parse_statement (JsonParser *parser,
case G_TOKEN_FLOAT:
case G_TOKEN_STRING:
priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
+
if (token == G_TOKEN_INT)
json_node_set_int (priv->current_node, scanner->value.v_int);
else if (token == G_TOKEN_FLOAT)
json_node_set_double (priv->current_node, scanner->value.v_float);
else
json_node_set_string (priv->current_node, scanner->value.v_string);
+
+ json_scanner_get_next_token (scanner);
return G_TOKEN_NONE;
default: