json: Improve strictness of the JSON parser

Backport of the upstream JSON-GLib commit that improved the strictness
of JsonParser.

The original upstream commit is:

  29881f03468db08bfb404cfcd5b61b4cdc419a87
This commit is contained in:
Emmanuele Bassi 2010-03-07 20:54:33 +00:00
parent 7c6567704d
commit 9ad1197cb2

View File

@ -358,13 +358,6 @@ json_parse_array (JsonParser *parser,
JsonNode *node = NULL; JsonNode *node = NULL;
gboolean negative = FALSE; gboolean negative = FALSE;
if (token == G_TOKEN_COMMA)
{
/* swallow the comma */
token = g_scanner_get_next_token (scanner);
continue;
}
/* nested object */ /* nested object */
if (token == G_TOKEN_LEFT_CURLY) if (token == G_TOKEN_LEFT_CURLY)
{ {
@ -396,7 +389,18 @@ json_parse_array (JsonParser *parser,
if (token == G_TOKEN_RIGHT_BRACE) if (token == G_TOKEN_RIGHT_BRACE)
break; break;
continue; if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_BRACE)
return G_TOKEN_SYMBOL;
continue;
}
json_array_unref (array);
return G_TOKEN_RIGHT_BRACE;
} }
/* nested array */ /* nested array */
@ -430,7 +434,18 @@ json_parse_array (JsonParser *parser,
if (token == G_TOKEN_RIGHT_BRACE) if (token == G_TOKEN_RIGHT_BRACE)
break; break;
continue; if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_BRACE)
return G_TOKEN_SYMBOL;
continue;
}
json_array_unref (array);
return G_TOKEN_RIGHT_BRACE;
} }
if (token == '-') if (token == '-')
@ -497,6 +512,21 @@ json_parse_array (JsonParser *parser,
} }
token = g_scanner_get_next_token (scanner); token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_BRACE)
break;
if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_BRACE)
return G_TOKEN_SYMBOL;
continue;
}
json_array_unref (array);
return G_TOKEN_RIGHT_BRACE;
} }
json_node_take_array (priv->current_node, array); json_node_take_array (priv->current_node, array);
@ -534,13 +564,6 @@ json_parse_object (JsonParser *parser,
gchar *name = NULL; gchar *name = NULL;
gboolean negative = FALSE; gboolean negative = FALSE;
if (token == G_TOKEN_COMMA)
{
/* swallow the comma */
token = g_scanner_get_next_token (scanner);
continue;
}
if (token == G_TOKEN_STRING) if (token == G_TOKEN_STRING)
{ {
name = g_strdup (scanner->value.v_string); name = g_strdup (scanner->value.v_string);
@ -603,7 +626,18 @@ json_parse_object (JsonParser *parser,
if (token == G_TOKEN_RIGHT_CURLY) if (token == G_TOKEN_RIGHT_CURLY)
break; break;
continue; if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_CURLY)
return G_TOKEN_SYMBOL;
continue;
}
json_object_unref (object);
return G_TOKEN_RIGHT_CURLY;
} }
if (token == G_TOKEN_LEFT_BRACE) if (token == G_TOKEN_LEFT_BRACE)
@ -636,10 +670,21 @@ json_parse_object (JsonParser *parser,
g_free (name); g_free (name);
token = g_scanner_get_next_token (scanner); token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_BRACE) if (token == G_TOKEN_RIGHT_CURLY)
break; break;
continue; if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_CURLY)
return G_TOKEN_SYMBOL;
continue;
}
json_object_unref (object);
return G_TOKEN_RIGHT_CURLY;
} }
if (token == '-') if (token == '-')
@ -707,6 +752,21 @@ json_parse_object (JsonParser *parser,
g_free (name); g_free (name);
token = g_scanner_get_next_token (scanner); token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_CURLY)
break;
if (token == G_TOKEN_COMMA)
{
token = g_scanner_get_next_token (scanner);
if (token == G_TOKEN_RIGHT_CURLY)
return G_TOKEN_SYMBOL;
continue;
}
json_object_unref (object);
return G_TOKEN_RIGHT_CURLY;
} }
json_node_take_object (priv->current_node, object); json_node_take_object (priv->current_node, object);