9ae3a8
From b3e87d63aec8631b853cb86a0736af41954769a4 Mon Sep 17 00:00:00 2001
9ae3a8
From: Markus Armbruster <armbru@redhat.com>
9ae3a8
Date: Wed, 27 Jul 2016 07:35:12 +0200
9ae3a8
Subject: [PATCH 14/16] json-streamer: Don't leak tokens on incomplete parse
9ae3a8
9ae3a8
RH-Author: Markus Armbruster <armbru@redhat.com>
9ae3a8
Message-id: <1469604913-12442-16-git-send-email-armbru@redhat.com>
9ae3a8
Patchwork-id: 71477
9ae3a8
O-Subject: [RHEL-7.3 qemu-kvm PATCH v2 14/15] json-streamer: Don't leak tokens on incomplete parse
9ae3a8
Bugzilla: 1276036
9ae3a8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
RH-Acked-by: John Snow <jsnow@redhat.com>
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
9ae3a8
From: Eric Blake <eblake@redhat.com>
9ae3a8
9ae3a8
Valgrind complained about a number of leaks in
9ae3a8
tests/check-qobject-json:
9ae3a8
9ae3a8
==12657==    definitely lost: 17,247 bytes in 1,234 blocks
9ae3a8
9ae3a8
All of which had the same root cause: on an incomplete parse,
9ae3a8
we were abandoning the token queue without cleaning up the
9ae3a8
allocated data within each queue element.  Introduced in
9ae3a8
commit 95385fe, when we switched from QList (which recursively
9ae3a8
frees contents) to g_queue (which does not).
9ae3a8
9ae3a8
We don't yet require glib 2.32 with its g_queue_free_full(),
9ae3a8
so open-code it instead.
9ae3a8
9ae3a8
CC: qemu-stable@nongnu.org
9ae3a8
Signed-off-by: Eric Blake <eblake@redhat.com>
9ae3a8
Message-Id: <1463608012-12760-1-git-send-email-eblake@redhat.com>
9ae3a8
Reviewed-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
Signed-off-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
(cherry picked from commit ba4dba54347d5062436a8553f527dbbed6dcf069)
9ae3a8
Signed-off-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 qobject/json-streamer.c | 6 ++++++
9ae3a8
 1 file changed, 6 insertions(+)
9ae3a8
9ae3a8
diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
9ae3a8
index a4db4b8..3c7d6be 100644
9ae3a8
--- a/qobject/json-streamer.c
9ae3a8
+++ b/qobject/json-streamer.c
9ae3a8
@@ -19,9 +19,15 @@
9ae3a8
 #define MAX_TOKEN_COUNT (2ULL << 20)
9ae3a8
 #define MAX_NESTING (1ULL << 10)
9ae3a8
 
9ae3a8
+static void json_message_free_token(void *token, void *opaque)
9ae3a8
+{
9ae3a8
+    g_free(token);
9ae3a8
+}
9ae3a8
+
9ae3a8
 static void json_message_free_tokens(JSONMessageParser *parser)
9ae3a8
 {
9ae3a8
     if (parser->tokens) {
9ae3a8
+        g_queue_foreach(parser->tokens, json_message_free_token, NULL);
9ae3a8
         g_queue_free(parser->tokens);
9ae3a8
         parser->tokens = NULL;
9ae3a8
     }
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8