[json-glib] [parser] Advance the tokenizer to avoid an infinite loop



commit 112a8ec8dfd9c46304008b62e8ab256ed7714644
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Sun Jun 28 23:49:51 2009 +0100

    [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.

 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:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]