Blame SOURCES/kvm-json-streamer-Don-t-leak-tokens-on-incomplete-parse.patch

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