From 8080df63b4b4eae3b59d1214fc67f48149f49773 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 13 Apr 2009 22:25:42 +0100 Subject: [parser] Prevent leaks on error codepaths Static analysis of the code showed some potential leaks inside error paths for JsonParser. Thanks to: Gordon Williams --- json-glib/json-parser.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'json-glib/json-parser.c') diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c index 46a05f5..8786ff3 100644 --- a/json-glib/json-parser.c +++ b/json-glib/json-parser.c @@ -392,7 +392,11 @@ json_parse_array (JsonParser *parser, break; if (token != G_TOKEN_COMMA) - return G_TOKEN_RIGHT_BRACE; + { + json_array_unref (array); + + return G_TOKEN_RIGHT_BRACE; + } continue; } @@ -429,7 +433,11 @@ json_parse_array (JsonParser *parser, break; if (token != G_TOKEN_COMMA) - return G_TOKEN_RIGHT_BRACE; + { + json_array_unref (array); + + return G_TOKEN_RIGHT_BRACE; + } continue; } @@ -446,6 +454,8 @@ json_parse_array (JsonParser *parser, } else { + json_array_unref (array); + return G_TOKEN_INT; } } @@ -480,6 +490,7 @@ json_parse_array (JsonParser *parser, break; default: + json_array_unref (array); return G_TOKEN_RIGHT_BRACE; } @@ -495,7 +506,11 @@ json_parse_array (JsonParser *parser, token = json_scanner_get_next_token (scanner); if (token != G_TOKEN_COMMA && token != G_TOKEN_RIGHT_BRACE) - return G_TOKEN_RIGHT_BRACE; + { + json_array_unref (array); + + return G_TOKEN_RIGHT_BRACE; + } } json_node_take_array (priv->current_node, array); @@ -604,7 +619,11 @@ json_parse_object (JsonParser *parser, break; if (token != G_TOKEN_COMMA) - return G_TOKEN_RIGHT_CURLY; + { + json_object_unref (object); + + return G_TOKEN_RIGHT_CURLY; + } continue; } @@ -643,7 +662,11 @@ json_parse_object (JsonParser *parser, break; if (token != G_TOKEN_COMMA) - return G_TOKEN_RIGHT_CURLY; + { + json_object_unref (object); + + return G_TOKEN_RIGHT_CURLY; + } continue; } @@ -659,6 +682,9 @@ json_parse_object (JsonParser *parser, } else { + g_free (name); + json_object_unref (object); + return G_TOKEN_INT; } } @@ -693,6 +719,8 @@ json_parse_object (JsonParser *parser, break; default: + g_free (name); + json_object_unref (object); return G_TOKEN_SYMBOL; } -- cgit v1.2.1