qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qom-test: fix qmp() leaks


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH] qom-test: fix qmp() leaks
Date: Wed, 02 Dec 2015 19:50:42 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

address@hidden writes:

> From: Marc-André Lureau <address@hidden>
>
> Before this patch ASAN reported:
> SUMMARY: AddressSanitizer: 677165875 byte(s) leaked in 1272437 allocation(s)
>
> After this patch:
> SUMMARY: AddressSanitizer: 465 byte(s) leaked in 32 allocation(s)
>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
>  tests/qom-test.c | 25 ++++++++++++++++---------
>  1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/tests/qom-test.c b/tests/qom-test.c
> index fde04e7..8a08fd7 100644
> --- a/tests/qom-test.c
> +++ b/tests/qom-test.c
> @@ -47,7 +47,7 @@ static bool is_blacklisted(const char *arch, const char 
> *mach)
>  static void test_properties(const char *path, bool recurse)
>  {
>      char *child_path;
> -    QDict *response, *tuple;
> +    QDict *response, *tuple, *tmp;
>      QList *list;
>      QListEntry *entry;
>  
> @@ -57,6 +57,7 @@ static void test_properties(const char *path, bool recurse)
>      g_assert(response);
>  
>      if (!recurse) {
> +        QDECREF(response);
>          return;
>      }
>  
> @@ -75,19 +76,21 @@ static void test_properties(const char *path, bool 
> recurse)
>          } else {
>              const char *prop = qdict_get_str(tuple, "name");
>              g_test_message("Testing property %s.%s", path, prop);
> -            response = qmp("{ 'execute': 'qom-get',"
> -                           "  'arguments': { 'path': %s,"
> -                           "                 'property': %s } }",
> -                           path, prop);
> +            tmp = qmp("{ 'execute': 'qom-get',"
> +                      "  'arguments': { 'path': %s,"
> +                      "                 'property': %s } }",
> +                      path, prop);
>              /* qom-get may fail but should not, e.g., segfault. */
> -            g_assert(response);
> +            g_assert(tmp);
> +            QDECREF(tmp);
>          }
>      }
> +    QDECREF(response);
>  }
>  
> -static void test_machine(gconstpointer data)
> +static void test_machine(gpointer data)
>  {
> -    const char *machine = data;
> +    char *machine = data;
>      char *args;
>      QDict *response;
>  

Why drop const?

> @@ -98,9 +101,11 @@ static void test_machine(gconstpointer data)
>  
>      response = qmp("{ 'execute': 'quit' }");
>      g_assert(qdict_haskey(response, "return"));
> +    QDECREF(response);
>  
>      qtest_end();
>      g_free(args);
> +    g_free(machine);

Hmm, I guess so you can g_free() without a cast.

>  }
>  
>  static void add_machine_test_cases(void)
> @@ -129,10 +134,12 @@ static void add_machine_test_cases(void)
>          mname = qstring_get_str(qstr);
>          if (!is_blacklisted(arch, mname)) {
>              path = g_strdup_printf("qom/%s", mname);
> -            qtest_add_data_func(path, mname, test_machine);
> +            qtest_add_data_func(path, g_strdup(mname), test_machine);

I wonder why changing test_machine()'s type doesn't make the compiler
gripe here...  argh!

    void qtest_add_data_func(const char *str, const void *data, void (*fn));

void (*fn) is just a stupid way to write void *fn.  Bye-bye
type-checking.

I'll post a patch fixing this.

>          }
>      }
> +
>      qtest_end();
> +    QDECREF(response);
>  }
>  
>  int main(int argc, char **argv)

Reviewed-by: Markus Armbruster <address@hidden>

I intend to rebase this patch onto mine.  Changes should be trivial,
though.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]