From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57160) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIWQB-0006Xa-4h for qemu-devel@nongnu.org; Thu, 30 Jun 2016 03:30:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bIWQ9-0006GN-1B for qemu-devel@nongnu.org; Thu, 30 Jun 2016 03:29:59 -0400 From: Markus Armbruster Date: Thu, 30 Jun 2016 09:29:46 +0200 Message-Id: <1467271792-20418-2-git-send-email-armbru@redhat.com> In-Reply-To: <1467271792-20418-1-git-send-email-armbru@redhat.com> References: <1467271792-20418-1-git-send-email-armbru@redhat.com> Subject: [Qemu-devel] [PULL 1/7] json-streamer: Don't leak tokens on incomplete parse List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Eric Blake , qemu-stable@nongnu.org From: Eric Blake 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 Message-Id: <1463608012-12760-1-git-send-email-eblake@redhat.com> Reviewed-by: Markus Armbruster Signed-off-by: Markus Armbruster --- qobject/json-streamer.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c index 0251685..7164390 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; } -- 2.5.5