summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2016-05-18 15:46:52 -0600
committerMarkus Armbruster <armbru@redhat.com>2016-06-30 15:24:36 +0200
commitba4dba54347d5062436a8553f527dbbed6dcf069 (patch)
tree55d7c7bd7ab561fffd1f600589f40e6e5f457d22
parent297e8005f88d4360480eaa2c07220fa8853f0448 (diff)
downloadfocaccia-qemu-ba4dba54347d5062436a8553f527dbbed6dcf069.tar.gz
focaccia-qemu-ba4dba54347d5062436a8553f527dbbed6dcf069.zip
json-streamer: Don't leak tokens on incomplete parse
Valgrind complained about a number of leaks in
tests/check-qobject-json:

==12657==    definitely lost: 17,247 bytes in 1,234 blocks

All of which had the same root cause: on an incomplete parse,
we were abandoning the token queue without cleaning up the
allocated data within each queue element.  Introduced in
commit 95385fe, when we switched from QList (which recursively
frees contents) to g_queue (which does not).

We don't yet require glib 2.32 with its g_queue_free_full(),
so open-code it instead.

CC: qemu-stable@nongnu.org
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1463608012-12760-1-git-send-email-eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
-rw-r--r--qobject/json-streamer.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
index 02516853a1..7164390cf5 100644
--- a/qobject/json-streamer.c
+++ b/qobject/json-streamer.c
@@ -20,9 +20,15 @@
 #define MAX_TOKEN_COUNT (2ULL << 20)
 #define MAX_NESTING (1ULL << 10)
 
+static void json_message_free_token(void *token, void *opaque)
+{
+    g_free(token);
+}
+
 static void json_message_free_tokens(JSONMessageParser *parser)
 {
     if (parser->tokens) {
+        g_queue_foreach(parser->tokens, json_message_free_token, NULL);
         g_queue_free(parser->tokens);
         parser->tokens = NULL;
     }