diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2009-06-28 23:49:51 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2009-06-28 23:49:51 +0100 |
commit | 112a8ec8dfd9c46304008b62e8ab256ed7714644 (patch) | |
tree | 657e107778f2d610764f916383e9a96ab98d0a5b /json-glib/json-parser.c | |
parent | 4ecdd6bedb7961f3a33971aa1f2338115a60f7f3 (diff) | |
download | json-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.c | 16 |
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: |