Eric Blake <ebl...@redhat.com> writes:

> 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.

Should we add a replacement g_queue_free_full() to glib-compat.h?

> CC: qemu-sta...@nongnu.org
> Signed-off-by: Eric Blake <ebl...@redhat.com>
> ---
>  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;
>      }

Since open-coding is a one-liner, I'm okay with it.

Applied to my qapi-next branch, thanks!

Reply via email to