]> git.proxmox.com Git - mirror_qemu.git/commitdiff
json-streamer: Don't leak tokens on incomplete parse
authorEric Blake <eblake@redhat.com>
Wed, 18 May 2016 21:46:52 +0000 (15:46 -0600)
committerMarkus Armbruster <armbru@redhat.com>
Thu, 30 Jun 2016 13:24:36 +0000 (15:24 +0200)
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>
qobject/json-streamer.c

index 02516853a13d50a1287af5e48d7774f80e945d19..7164390cf5a8ddaadd54e3bf2f15a15ecc52ae55 100644 (file)
 #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;
     }