qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULLv2 00/25] Leak patches
@ 2016-09-08 14:16 Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 01/25] tests: fix test-qga leaks Marc-André Lureau
                   ` (25 more replies)
  0 siblings, 26 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

The following changes since commit 59351d9b40b1de0fb77e1ff3e53faa04c995c707:

  Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.8-20160907' into staging (2016-09-08 11:28:12 +0100)

are available in the git repository at:

  git@github.com:elmarco/qemu.git tags/leak-pull-request

for you to fetch changes up to e2dd21e510ed66daeb4c5d58638450c1fb8c6fea:

  tests: fix postcopy-test leaks (2016-09-08 18:05:22 +0400)

----------------------------------------------------------------
Pull request

v2:
- dropped "tests: fix small leak in test-io-channel-command" that Daniel Berrange will pick
- fixed "tests: add qtest_add_data_func_full" to work with glib < 2.26

----------------------------------------------------------------

Marc-André Lureau (25):
  tests: fix test-qga leaks
  glib-compat: add g_(s)list_free_full()
  qga: free the whole blacklist
  qga: free remaining leaking state
  tests: fix test-cutils leaks
  tests: fix test-vmstate leaks
  tests: fix test-iov leaks
  tests: fix check-qom-interface leaks
  tests: fix check-qom-proplist leaks
  tests: fix leak in test-string-input-visitor
  portio: keep references on portio
  pc: simplify passing qemu_irq
  pc: don't leak a20_line
  machine: use class base init generated name
  acpi-build: fix array leak
  tests: fix qom-test leaks
  pc: free i8259
  pc: keep gsi reference
  sd: free timer
  ipmi: free extern timer
  bus: simplify name handling
  tests: add qtest_add_data_func_full
  tests: pc-cpu-test leaks fixes
  tests: fix rsp leak in postcopy-test
  tests: fix postcopy-test leaks

 hw/audio/gus.c                    |  9 ++++++---
 hw/audio/sb16.c                   |  4 +++-
 hw/block/fdc.c                    |  4 +++-
 hw/char/parallel.c                |  3 ++-
 hw/core/bus.c                     | 21 ++++++---------------
 hw/core/machine.c                 |  1 +
 hw/display/vga-isa.c              |  8 ++++++--
 hw/dma/i8257.c                    |  6 ++++--
 hw/i386/acpi-build.c              |  4 ++--
 hw/i386/pc.c                      |  9 +++++----
 hw/i386/pc_piix.c                 | 17 ++++++++---------
 hw/i386/pc_q35.c                  | 15 ++++++++-------
 hw/ide/core.c                     |  6 ++++--
 hw/input/pckbd.c                  |  4 ++--
 hw/ipmi/ipmi_bmc_extern.c         |  9 +++++++++
 hw/isa/isa-bus.c                  | 14 +++++---------
 hw/sd/sd.c                        |  9 +++++++++
 qga/guest-agent-command-state.c   |  6 ++++++
 qga/main.c                        | 13 +++++++------
 tests/check-qom-interface.c       |  1 +
 tests/check-qom-proplist.c        | 16 ++++++++++++++++
 tests/libqtest.c                  | 19 +++++++++++++++++++
 tests/pc-cpu-test.c               | 24 +++++++++++++++++++-----
 tests/postcopy-test.c             |  7 +++++--
 tests/qom-test.c                  |  5 +++--
 tests/test-cutils.c               | 24 ++++++++++++++++--------
 tests/test-iov.c                  |  7 +++++++
 tests/test-qga.c                  |  5 +++++
 tests/test-string-input-visitor.c |  1 +
 tests/test-vmstate.c              |  8 ++++++--
 tests/libqtest.h                  | 17 +++++++++++++++++
 include/glib-compat.h             | 24 ++++++++++++++++++++++++
 include/hw/boards.h               |  2 +-
 include/hw/i386/pc.h              |  4 ++--
 include/hw/ide/internal.h         |  2 ++
 include/hw/isa/i8257.h            |  2 ++
 include/hw/isa/isa.h              |  5 ++++-
 include/hw/qdev-core.h            |  2 +-
 qga/guest-agent-core.h            |  1 +
 39 files changed, 248 insertions(+), 90 deletions(-)

-- 
2.10.0

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 01/25] tests: fix test-qga leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
@ 2016-09-08 14:16 ` Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 02/25] glib-compat: add g_(s)list_free_full() Marc-André Lureau
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-qga.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/tests/test-qga.c b/tests/test-qga.c
index dac8fb8..21f44f8 100644
--- a/tests/test-qga.c
+++ b/tests/test-qga.c
@@ -398,6 +398,7 @@ static void test_qga_file_ops(gconstpointer fix)
     /* check content */
     path = g_build_filename(fixture->test_dir, "foo", NULL);
     f = fopen(path, "r");
+    g_free(path);
     g_assert_nonnull(f);
     count = fread(tmp, 1, sizeof(tmp), f);
     g_assert_cmpint(count, ==, sizeof(helloworld));
@@ -700,7 +701,9 @@ static void test_qga_config(gconstpointer data)
     cwd = g_get_current_dir();
     cmd = g_strdup_printf("%s%cqemu-ga -D",
                           cwd, G_DIR_SEPARATOR);
+    g_free(cwd);
     g_shell_parse_argv(cmd, NULL, &argv, &error);
+    g_free(cmd);
     g_assert_no_error(error);
 
     env[0] = g_strdup_printf("QGA_CONF=tests%cdata%ctest-qga-config",
@@ -708,6 +711,8 @@ static void test_qga_config(gconstpointer data)
     env[1] = NULL;
     g_spawn_sync(NULL, argv, env, 0,
                  NULL, NULL, &out, &err, &status, &error);
+    g_strfreev(argv);
+
     g_assert_no_error(error);
     g_assert_cmpstr(err, ==, "");
     g_assert_cmpint(status, ==, 0);
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 02/25] glib-compat: add g_(s)list_free_full()
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 01/25] tests: fix test-qga leaks Marc-André Lureau
@ 2016-09-08 14:16 ` Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 03/25] qga: free the whole blacklist Marc-André Lureau
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Those functions are only available since glib 2.28.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 include/glib-compat.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/include/glib-compat.h b/include/glib-compat.h
index 8d5a7f3..8093163 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -280,4 +280,28 @@ static inline void g_hash_table_add(GHashTable *hash_table, gpointer key)
     } while (0)
 #endif
 
+#if !GLIB_CHECK_VERSION(2, 28, 0)
+static inline void g_list_free_full(GList *list, GDestroyNotify free_func)
+{
+    GList *l;
+
+    for (l = list; l; l = l->next) {
+        free_func(l->data);
+    }
+
+    g_list_free(list);
+}
+
+static inline void g_slist_free_full(GSList *list, GDestroyNotify free_func)
+{
+    GSList *l;
+
+    for (l = list; l; l = l->next) {
+        free_func(l->data);
+    }
+
+    g_slist_free(list);
+}
+#endif
+
 #endif
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 03/25] qga: free the whole blacklist
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 01/25] tests: fix test-qga leaks Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 02/25] glib-compat: add g_(s)list_free_full() Marc-André Lureau
@ 2016-09-08 14:16 ` Marc-André Lureau
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 04/25] qga: free remaining leaking state Marc-André Lureau
                   ` (22 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Free the config blacklist list, not just the elements. Do it so in the
more appropriate function config_free().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 qga/main.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/qga/main.c b/qga/main.c
index 4c3b2c7..bb48214 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -1175,6 +1175,7 @@ static void config_free(GAConfig *config)
 #ifdef CONFIG_FSFREEZE
     g_free(config->fsfreeze_hook);
 #endif
+    g_list_free_full(config->blacklist, g_free);
     g_free(config);
 }
 
@@ -1310,11 +1311,6 @@ static int run_agent(GAState *s, GAConfig *config)
     return EXIT_SUCCESS;
 }
 
-static void free_blacklist_entry(gpointer entry, gpointer unused)
-{
-    g_free(entry);
-}
-
 int main(int argc, char **argv)
 {
     int ret = EXIT_SUCCESS;
@@ -1379,7 +1375,6 @@ end:
     if (s->channel) {
         ga_channel_free(s->channel);
     }
-    g_list_foreach(config->blacklist, free_blacklist_entry, NULL);
     g_free(s->pstate_filepath);
     g_free(s->state_filepath_isfrozen);
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 04/25] qga: free remaining leaking state
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (2 preceding siblings ...)
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 03/25] qga: free the whole blacklist Marc-André Lureau
@ 2016-09-08 14:16 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 05/25] tests: fix test-cutils leaks Marc-André Lureau
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 qga/guest-agent-command-state.c | 6 ++++++
 qga/main.c                      | 6 ++++++
 qga/guest-agent-core.h          | 1 +
 3 files changed, 13 insertions(+)

diff --git a/qga/guest-agent-command-state.c b/qga/guest-agent-command-state.c
index 4de229c..e609d32 100644
--- a/qga/guest-agent-command-state.c
+++ b/qga/guest-agent-command-state.c
@@ -71,3 +71,9 @@ GACommandState *ga_command_state_new(void)
     cs->groups = NULL;
     return cs;
 }
+
+void ga_command_state_free(GACommandState *cs)
+{
+    g_slist_free_full(cs->groups, g_free);
+    g_free(cs);
+}
diff --git a/qga/main.c b/qga/main.c
index bb48214..0b9d04e 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -1371,6 +1371,8 @@ int main(int argc, char **argv)
 end:
     if (s->command_state) {
         ga_command_state_cleanup_all(s->command_state);
+        ga_command_state_free(s->command_state);
+        json_message_parser_destroy(&s->parser);
     }
     if (s->channel) {
         ga_channel_free(s->channel);
@@ -1383,6 +1385,10 @@ end:
     }
 
     config_free(config);
+    if (s->main_loop) {
+        g_main_loop_unref(s->main_loop);
+    }
+    g_free(s);
 
     return ret;
 }
diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h
index 0a49516..63e9d39 100644
--- a/qga/guest-agent-core.h
+++ b/qga/guest-agent-core.h
@@ -28,6 +28,7 @@ void ga_command_state_add(GACommandState *cs,
 void ga_command_state_init_all(GACommandState *cs);
 void ga_command_state_cleanup_all(GACommandState *cs);
 GACommandState *ga_command_state_new(void);
+void ga_command_state_free(GACommandState *cs);
 bool ga_logging_enabled(GAState *s);
 void ga_disable_logging(GAState *s);
 void ga_enable_logging(GAState *s);
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 05/25] tests: fix test-cutils leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (3 preceding siblings ...)
  2016-09-08 14:16 ` [Qemu-devel] [PULLv2 04/25] qga: free remaining leaking state Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 06/25] tests: fix test-vmstate leaks Marc-André Lureau
                   ` (20 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Spotted thanks to ASAN.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-cutils.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/tests/test-cutils.c b/tests/test-cutils.c
index 64e3e95..20b0f59 100644
--- a/tests/test-cutils.c
+++ b/tests/test-cutils.c
@@ -378,7 +378,7 @@ static void test_qemu_strtol_hex(void)
 
 static void test_qemu_strtol_max(void)
 {
-    const char *str = g_strdup_printf("%ld", LONG_MAX);
+    char *str = g_strdup_printf("%ld", LONG_MAX);
     char f = 'X';
     const char *endptr = &f;
     long res = 999;
@@ -389,6 +389,7 @@ static void test_qemu_strtol_max(void)
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, LONG_MAX);
     g_assert(endptr == str + strlen(str));
+    g_free(str);
 }
 
 static void test_qemu_strtol_overflow(void)
@@ -497,7 +498,7 @@ static void test_qemu_strtol_full_trailing(void)
 
 static void test_qemu_strtol_full_max(void)
 {
-    const char *str = g_strdup_printf("%ld", LONG_MAX);
+    char *str = g_strdup_printf("%ld", LONG_MAX);
     long res;
     int err;
 
@@ -505,6 +506,7 @@ static void test_qemu_strtol_full_max(void)
 
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, LONG_MAX);
+    g_free(str);
 }
 
 static void test_qemu_strtoul_correct(void)
@@ -662,7 +664,7 @@ static void test_qemu_strtoul_hex(void)
 
 static void test_qemu_strtoul_max(void)
 {
-    const char *str = g_strdup_printf("%lu", ULONG_MAX);
+    char *str = g_strdup_printf("%lu", ULONG_MAX);
     char f = 'X';
     const char *endptr = &f;
     unsigned long res = 999;
@@ -673,6 +675,7 @@ static void test_qemu_strtoul_max(void)
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, ULONG_MAX);
     g_assert(endptr == str + strlen(str));
+    g_free(str);
 }
 
 static void test_qemu_strtoul_overflow(void)
@@ -776,7 +779,7 @@ static void test_qemu_strtoul_full_trailing(void)
 
 static void test_qemu_strtoul_full_max(void)
 {
-    const char *str = g_strdup_printf("%lu", ULONG_MAX);
+    char *str = g_strdup_printf("%lu", ULONG_MAX);
     unsigned long res = 999;
     int err;
 
@@ -784,6 +787,7 @@ static void test_qemu_strtoul_full_max(void)
 
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, ULONG_MAX);
+    g_free(str);
 }
 
 static void test_qemu_strtoll_correct(void)
@@ -941,7 +945,7 @@ static void test_qemu_strtoll_hex(void)
 
 static void test_qemu_strtoll_max(void)
 {
-    const char *str = g_strdup_printf("%lld", LLONG_MAX);
+    char *str = g_strdup_printf("%lld", LLONG_MAX);
     char f = 'X';
     const char *endptr = &f;
     int64_t res = 999;
@@ -952,6 +956,7 @@ static void test_qemu_strtoll_max(void)
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, LLONG_MAX);
     g_assert(endptr == str + strlen(str));
+    g_free(str);
 }
 
 static void test_qemu_strtoll_overflow(void)
@@ -1058,7 +1063,7 @@ static void test_qemu_strtoll_full_trailing(void)
 static void test_qemu_strtoll_full_max(void)
 {
 
-    const char *str = g_strdup_printf("%lld", LLONG_MAX);
+    char *str = g_strdup_printf("%lld", LLONG_MAX);
     int64_t res;
     int err;
 
@@ -1066,6 +1071,7 @@ static void test_qemu_strtoll_full_max(void)
 
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, LLONG_MAX);
+    g_free(str);
 }
 
 static void test_qemu_strtoull_correct(void)
@@ -1223,7 +1229,7 @@ static void test_qemu_strtoull_hex(void)
 
 static void test_qemu_strtoull_max(void)
 {
-    const char *str = g_strdup_printf("%llu", ULLONG_MAX);
+    char *str = g_strdup_printf("%llu", ULLONG_MAX);
     char f = 'X';
     const char *endptr = &f;
     uint64_t res = 999;
@@ -1234,6 +1240,7 @@ static void test_qemu_strtoull_max(void)
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, ULLONG_MAX);
     g_assert(endptr == str + strlen(str));
+    g_free(str);
 }
 
 static void test_qemu_strtoull_overflow(void)
@@ -1339,7 +1346,7 @@ static void test_qemu_strtoull_full_trailing(void)
 
 static void test_qemu_strtoull_full_max(void)
 {
-    const char *str = g_strdup_printf("%lld", ULLONG_MAX);
+    char *str = g_strdup_printf("%lld", ULLONG_MAX);
     uint64_t res = 999;
     int err;
 
@@ -1347,6 +1354,7 @@ static void test_qemu_strtoull_full_max(void)
 
     g_assert_cmpint(err, ==, 0);
     g_assert_cmpint(res, ==, ULLONG_MAX);
+    g_free(str);
 }
 
 static void test_qemu_strtosz_simple(void)
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 06/25] tests: fix test-vmstate leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (4 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 05/25] tests: fix test-cutils leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 07/25] tests: fix test-iov leaks Marc-André Lureau
                   ` (19 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Spotted thanks to ASAN.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-vmstate.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c
index 41fd841..d8da26f 100644
--- a/tests/test-vmstate.c
+++ b/tests/test-vmstate.c
@@ -50,16 +50,20 @@ static QEMUFile *open_test_file(bool write)
 {
     int fd = dup(temp_fd);
     QIOChannel *ioc;
+    QEMUFile *f;
+
     lseek(fd, 0, SEEK_SET);
     if (write) {
         g_assert_cmpint(ftruncate(fd, 0), ==, 0);
     }
     ioc = QIO_CHANNEL(qio_channel_file_new_fd(fd));
     if (write) {
-        return qemu_fopen_channel_output(ioc);
+        f = qemu_fopen_channel_output(ioc);
     } else {
-        return qemu_fopen_channel_input(ioc);
+        f = qemu_fopen_channel_input(ioc);
     }
+    object_unref(OBJECT(ioc));
+    return f;
 }
 
 #define SUCCESS(val) \
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 07/25] tests: fix test-iov leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (5 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 06/25] tests: fix test-vmstate leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 08/25] tests: fix check-qom-interface leaks Marc-André Lureau
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Spotted thanks to ASAN.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-iov.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/tests/test-iov.c b/tests/test-iov.c
index 46ae25e..a22d71f 100644
--- a/tests/test-iov.c
+++ b/tests/test-iov.c
@@ -208,6 +208,9 @@ static void test_io(void)
                } while(k < j);
            }
        }
+       iov_free(iov, niov);
+       g_free(buf);
+       g_free(siov);
        exit(0);
 
     } else {
@@ -246,6 +249,10 @@ static void test_io(void)
                test_iov_bytes(iov, niov, i, j - i);
            }
         }
+
+       iov_free(iov, niov);
+       g_free(buf);
+       g_free(siov);
      }
 #endif
 }
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 08/25] tests: fix check-qom-interface leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (6 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 07/25] tests: fix test-iov leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 09/25] tests: fix check-qom-proplist leaks Marc-André Lureau
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Found thanks to ASAN.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/check-qom-interface.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c
index 719ddcf..f87c9aa 100644
--- a/tests/check-qom-interface.c
+++ b/tests/check-qom-interface.c
@@ -76,6 +76,7 @@ static void test_interface_impl(const char *type)
 
     g_assert(iobj);
     g_assert(ioc->test == PATTERN);
+    object_unref(obj);
 }
 
 static void interface_direct_test(void)
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 09/25] tests: fix check-qom-proplist leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (7 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 08/25] tests: fix check-qom-interface leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 10/25] tests: fix leak in test-string-input-visitor Marc-André Lureau
                   ` (16 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Found thanks to ASAN.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/check-qom-proplist.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 42defe7..a16cefc 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -230,6 +230,13 @@ struct DummyBackendClass {
 };
 
 
+static void dummy_dev_finalize(Object *obj)
+{
+    DummyDev *dev = DUMMY_DEV(obj);
+
+    object_unref(OBJECT(dev->bus));
+}
+
 static void dummy_dev_init(Object *obj)
 {
     DummyDev *dev = DUMMY_DEV(obj);
@@ -257,6 +264,13 @@ static void dummy_dev_class_init(ObjectClass *klass, void *opaque)
 }
 
 
+static void dummy_bus_finalize(Object *obj)
+{
+    DummyBus *bus = DUMMY_BUS(obj);
+
+    object_unref(OBJECT(bus->backend));
+}
+
 static void dummy_bus_init(Object *obj)
 {
 }
@@ -283,6 +297,7 @@ static const TypeInfo dummy_dev_info = {
     .parent        = TYPE_OBJECT,
     .instance_size = sizeof(DummyDev),
     .instance_init = dummy_dev_init,
+    .instance_finalize = dummy_dev_finalize,
     .class_size = sizeof(DummyDevClass),
     .class_init = dummy_dev_class_init,
 };
@@ -292,6 +307,7 @@ static const TypeInfo dummy_bus_info = {
     .parent        = TYPE_OBJECT,
     .instance_size = sizeof(DummyBus),
     .instance_init = dummy_bus_init,
+    .instance_finalize = dummy_bus_finalize,
     .class_size = sizeof(DummyBusClass),
     .class_init = dummy_bus_class_init,
 };
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 10/25] tests: fix leak in test-string-input-visitor
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (8 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 09/25] tests: fix check-qom-proplist leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 11/25] portio: keep references on portio Marc-André Lureau
                   ` (15 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Free the list returned by visit_type_intList().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-string-input-visitor.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c
index d837ebe..a679fbc 100644
--- a/tests/test-string-input-visitor.c
+++ b/tests/test-string-input-visitor.c
@@ -228,6 +228,7 @@ static void test_visitor_in_fuzz(TestInputVisitorData *data,
 
         v = visitor_input_test_init(data, buf);
         visit_type_intList(v, NULL, &ilres, NULL);
+        qapi_free_intList(ilres);
         visitor_input_teardown(data, NULL);
 
         v = visitor_input_test_init(data, buf);
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 11/25] portio: keep references on portio
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (9 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 10/25] tests: fix leak in test-string-input-visitor Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 12/25] pc: simplify passing qemu_irq Marc-André Lureau
                   ` (14 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

The isa_register_portio_list() function allocates ioports
data/state. Let's keep the reference to this data on some owner.  This
isn't enough to fix leaks, but at least, ASAN stops complaining of
direct leaks. Further cleanup would require calling
portio_list_del/destroy().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/audio/gus.c            |  9 ++++++---
 hw/audio/sb16.c           |  4 +++-
 hw/block/fdc.c            |  4 +++-
 hw/char/parallel.c        |  3 ++-
 hw/display/vga-isa.c      |  8 ++++++--
 hw/dma/i8257.c            |  6 ++++--
 hw/ide/core.c             |  6 ++++--
 hw/isa/isa-bus.c          | 14 +++++---------
 include/hw/ide/internal.h |  2 ++
 include/hw/isa/i8257.h    |  2 ++
 include/hw/isa/isa.h      |  5 ++++-
 11 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/hw/audio/gus.c b/hw/audio/gus.c
index 6c02646..3d08a65 100644
--- a/hw/audio/gus.c
+++ b/hw/audio/gus.c
@@ -60,6 +60,8 @@ typedef struct GUSState {
     int64_t last_ticks;
     qemu_irq pic;
     IsaDma *isa_dma;
+    PortioList portio_list1;
+    PortioList portio_list2;
 } GUSState;
 
 static uint32_t gus_readb(void *opaque, uint32_t nport)
@@ -265,9 +267,10 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
     s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;
     s->mixbuf = g_malloc0 (s->samples << s->shift);
 
-    isa_register_portio_list (d, s->port, gus_portio_list1, s, "gus");
-    isa_register_portio_list (d, (s->port + 0x100) & 0xf00,
-                              gus_portio_list2, s, "gus");
+    isa_register_portio_list(d, &s->portio_list1, s->port,
+                             gus_portio_list1, s, "gus");
+    isa_register_portio_list(d, &s->portio_list2, (s->port + 0x100) & 0xf00,
+                             gus_portio_list2, s, "gus");
 
     s->isa_dma = isa_get_dma(isa_bus_from_device(d), s->emu.gusdma);
     k = ISADMA_GET_CLASS(s->isa_dma);
diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
index 3a4a57a..6b4427f 100644
--- a/hw/audio/sb16.c
+++ b/hw/audio/sb16.c
@@ -106,6 +106,7 @@ typedef struct SB16State {
     /* mixer state */
     int mixer_nreg;
     uint8_t mixer_regs[256];
+    PortioList portio_list;
 } SB16State;
 
 static void SB_audio_callback (void *opaque, int free);
@@ -1378,7 +1379,8 @@ static void sb16_realizefn (DeviceState *dev, Error **errp)
         dolog ("warning: Could not create auxiliary timer\n");
     }
 
-    isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb16");
+    isa_register_portio_list(isadev, &s->portio_list, s->port,
+                             sb16_ioport_list, s, "sb16");
 
     s->isa_hdma = isa_get_dma(isa_bus_from_device(isadev), s->hdma);
     k = ISADMA_GET_CLASS(s->isa_hdma);
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index f73af7d..b79873a 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -692,6 +692,7 @@ struct FDCtrl {
     /* Timers state */
     uint8_t timer0;
     uint8_t timer1;
+    PortioList portio_list;
 };
 
 static FloppyDriveType get_fallback_drive_type(FDrive *drv)
@@ -2495,7 +2496,8 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     FDCtrl *fdctrl = &isa->state;
     Error *err = NULL;
 
-    isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctrl,
+    isa_register_portio_list(isadev, &fdctrl->portio_list,
+                             isa->iobase, fdc_portio_list, fdctrl,
                              "fdc");
 
     isa_init_irq(isadev, &fdctrl->irq, isa->irq);
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
index 11c78fe..fa08566 100644
--- a/hw/char/parallel.c
+++ b/hw/char/parallel.c
@@ -80,6 +80,7 @@ typedef struct ParallelState {
     uint32_t last_read_offset; /* For debugging */
     /* Memory-mapped interface */
     int it_shift;
+    PortioList portio_list;
 } ParallelState;
 
 #define TYPE_ISA_PARALLEL "isa-parallel"
@@ -532,7 +533,7 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
         s->status = dummy;
     }
 
-    isa_register_portio_list(isadev, base,
+    isa_register_portio_list(isadev, &s->portio_list, base,
                              (s->hw_driver
                               ? &isa_parallel_portio_hw_list[0]
                               : &isa_parallel_portio_sw_list[0]),
diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
index f5aff1c..1af9556 100644
--- a/hw/display/vga-isa.c
+++ b/hw/display/vga-isa.c
@@ -39,6 +39,8 @@ typedef struct ISAVGAState {
     ISADevice parent_obj;
 
     struct VGACommonState state;
+    PortioList portio_vga;
+    PortioList portio_vbe;
 } ISAVGAState;
 
 static void vga_isa_reset(DeviceState *dev)
@@ -60,9 +62,11 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
     vga_common_init(s, OBJECT(dev), true);
     s->legacy_address_space = isa_address_space(isadev);
     vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports);
-    isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga");
+    isa_register_portio_list(isadev, &d->portio_vga,
+                             0x3b0, vga_ports, s, "vga");
     if (vbe_ports) {
-        isa_register_portio_list(isadev, 0x1ce, vbe_ports, s, "vbe");
+        isa_register_portio_list(isadev, &d->portio_vbe,
+                                 0x1ce, vbe_ports, s, "vbe");
     }
     memory_region_add_subregion_overlap(isa_address_space(isadev),
                                         0x000a0000,
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index f345c54..bffbdea 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -553,10 +553,12 @@ static void i8257_realize(DeviceState *dev, Error **errp)
     memory_region_add_subregion(isa_address_space_io(isa),
                                 d->base, &d->channel_io);
 
-    isa_register_portio_list(isa, d->page_base, page_portio_list, d,
+    isa_register_portio_list(isa, &d->portio_page,
+                             d->page_base, page_portio_list, d,
                              "dma-page");
     if (d->pageh_base >= 0) {
-        isa_register_portio_list(isa, d->pageh_base, pageh_portio_list, d,
+        isa_register_portio_list(isa, &d->portio_pageh,
+                                 d->pageh_base, pageh_portio_list, d,
                                  "dma-pageh");
     }
 
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 45b6df1..b0e42a6 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -2619,10 +2619,12 @@ void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
 {
     /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
        bridge has been setup properly to always register with ISA.  */
-    isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
+    isa_register_portio_list(dev, &bus->portio_list,
+                             iobase, ide_portio_list, bus, "ide");
 
     if (iobase2) {
-        isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
+        isa_register_portio_list(dev, &bus->portio2_list,
+                                 iobase2, ide_portio2_list, bus, "ide");
     }
 }
 
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index ce74db2..9d07b11 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -131,24 +131,20 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
     isa_init_ioport(dev, start);
 }
 
-void isa_register_portio_list(ISADevice *dev, uint16_t start,
+void isa_register_portio_list(ISADevice *dev,
+                              PortioList *piolist, uint16_t start,
                               const MemoryRegionPortio *pio_start,
                               void *opaque, const char *name)
 {
-    PortioList piolist;
+    assert(piolist && !piolist->owner);
 
     /* START is how we should treat DEV, regardless of the actual
        contents of the portio array.  This is how the old code
        actually handled e.g. the FDC device.  */
     isa_init_ioport(dev, start);
 
-    /* FIXME: the device should store created PortioList in its state.  Note
-       that DEV can be NULL here and that single device can register several
-       portio lists.  Current implementation is leaking memory allocated
-       in portio_list_init.  The leak is not critical because it happens only
-       at initialization time.  */
-    portio_list_init(&piolist, OBJECT(dev), pio_start, opaque, name);
-    portio_list_add(&piolist, isabus->address_space_io, start);
+    portio_list_init(piolist, OBJECT(dev), pio_start, opaque, name);
+    portio_list_add(piolist, isabus->address_space_io, start);
 }
 
 static void isa_device_init(Object *obj)
diff --git a/include/hw/ide/internal.h b/include/hw/ide/internal.h
index 7824bc3..a6dd2c3 100644
--- a/include/hw/ide/internal.h
+++ b/include/hw/ide/internal.h
@@ -480,6 +480,8 @@ struct IDEBus {
     uint8_t retry_unit;
     int64_t retry_sector_num;
     uint32_t retry_nsector;
+    PortioList portio_list;
+    PortioList portio2_list;
 };
 
 #define TYPE_IDE_DEVICE "ide-device"
diff --git a/include/hw/isa/i8257.h b/include/hw/isa/i8257.h
index aa211c0..88a2766 100644
--- a/include/hw/isa/i8257.h
+++ b/include/hw/isa/i8257.h
@@ -36,6 +36,8 @@ typedef struct I8257State {
     QEMUBH *dma_bh;
     bool dma_bh_scheduled;
     int running;
+    PortioList portio_page;
+    PortioList portio_pageh;
 } I8257State;
 
 #endif
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 7693ac5..c2fdd70 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -134,12 +134,15 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start);
  * device and use the legacy portio routines.
  *
  * @dev: the ISADevice against which these are registered; may be NULL.
+ * @piolist: the PortioList associated with the io ports
  * @start: the base I/O port against which the portio->offset is applied.
  * @portio: the ports, sorted by offset.
  * @opaque: passed into the portio callbacks.
  * @name: passed into memory_region_init_io.
  */
-void isa_register_portio_list(ISADevice *dev, uint16_t start,
+void isa_register_portio_list(ISADevice *dev,
+                              PortioList *piolist,
+                              uint16_t start,
                               const MemoryRegionPortio *portio,
                               void *opaque, const char *name);
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 12/25] pc: simplify passing qemu_irq
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (10 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 11/25] portio: keep references on portio Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 13/25] pc: don't leak a20_line Marc-André Lureau
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

qemu_irq is already a pointer, no need to have an extra pointer level.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 hw/i386/pc.c         | 8 ++++----
 hw/input/pckbd.c     | 4 ++--
 include/hw/i386/pc.h | 2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 022dd1b..15966ce 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -530,9 +530,9 @@ static uint64_t port92_read(void *opaque, hwaddr addr,
     return ret;
 }
 
-static void port92_init(ISADevice *dev, qemu_irq *a20_out)
+static void port92_init(ISADevice *dev, qemu_irq a20_out)
 {
-    qdev_connect_gpio_out_named(DEVICE(dev), PORT92_A20_LINE, 0, *a20_out);
+    qdev_connect_gpio_out_named(DEVICE(dev), PORT92_A20_LINE, 0, a20_out);
 }
 
 static const VMStateDescription vmstate_port92_isa = {
@@ -1594,7 +1594,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
 
     a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
     i8042 = isa_create_simple(isa_bus, "i8042");
-    i8042_setup_a20_line(i8042, &a20_line[0]);
+    i8042_setup_a20_line(i8042, a20_line[0]);
     if (!no_vmport) {
         vmport_init(isa_bus);
         vmmouse = isa_try_create(isa_bus, "vmmouse");
@@ -1607,7 +1607,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
         qdev_init_nofail(dev);
     }
     port92 = isa_create_simple(isa_bus, "port92");
-    port92_init(port92, &a20_line[1]);
+    port92_init(port92, a20_line[1]);
 
     DMA_init(isa_bus, 0);
 
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
index dc57e2c..d414288 100644
--- a/hw/input/pckbd.c
+++ b/hw/input/pckbd.c
@@ -499,9 +499,9 @@ void i8042_isa_mouse_fake_event(void *opaque)
     ps2_mouse_fake_event(s->mouse);
 }
 
-void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out)
+void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out)
 {
-    qdev_connect_gpio_out_named(DEVICE(dev), I8042_A20_LINE, 0, *a20_out);
+    qdev_connect_gpio_out_named(DEVICE(dev), I8042_A20_LINE, 0, a20_out);
 }
 
 static const VMStateDescription vmstate_kbd_isa = {
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 74c175c..330c1f2 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -220,7 +220,7 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
                    MemoryRegion *region, ram_addr_t size,
                    hwaddr mask);
 void i8042_isa_mouse_fake_event(void *opaque);
-void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);
+void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
 
 /* pc.c */
 extern int fd_bootchk;
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 13/25] pc: don't leak a20_line
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (11 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 12/25] pc: simplify passing qemu_irq Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 14/25] machine: use class base init generated name Marc-André Lureau
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

The irqs array is no longer being used

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 hw/i386/pc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 15966ce..e31f70f 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1608,6 +1608,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
     }
     port92 = isa_create_simple(isa_bus, "port92");
     port92_init(port92, a20_line[1]);
+    g_free(a20_line);
 
     DMA_init(isa_bus, 0);
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 14/25] machine: use class base init generated name
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (12 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 13/25] pc: don't leak a20_line Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 15/25] acpi-build: fix array leak Marc-André Lureau
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

machine_class_base_init() member name is allocated by
machine_class_base_init(), but not freed by
machine_class_finalize().  Simply freeing there doesn't work,
because DEFINE_PC_MACHINE() overwrites it with a literal string.

Fix DEFINE_PC_MACHINE() not to overwrite it, and add the missing
free to machine_class_finalize().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 hw/core/machine.c    | 1 +
 include/hw/boards.h  | 2 +-
 include/hw/i386/pc.h | 1 -
 3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index e5a456f..00fbe3e 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -561,6 +561,7 @@ static void machine_class_finalize(ObjectClass *klass, void *data)
     if (mc->compat_props) {
         g_array_free(mc->compat_props, true);
     }
+    g_free(mc->name);
 }
 
 void machine_register_compat_props(MachineState *machine)
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 3e69eca..e46a744 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -93,7 +93,7 @@ struct MachineClass {
     /*< public >*/
 
     const char *family; /* NULL iff @name identifies a standalone machtype */
-    const char *name;
+    char *name;
     const char *alias;
     const char *desc;
 
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 330c1f2..422fac7 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -903,7 +903,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
     { \
         MachineClass *mc = MACHINE_CLASS(oc); \
         optsfn(mc); \
-        mc->name = namestr; \
         mc->init = initfn; \
     } \
     static const TypeInfo pc_machine_type_##suffix = { \
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 15/25] acpi-build: fix array leak
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (13 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 14/25] machine: use class base init generated name Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 16/25] tests: fix qom-test leaks Marc-André Lureau
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

The free_ranges array is used as a temporary pointer array, the segment
should still be freed, however, it shouldn't free the elements themself.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
---
 hw/i386/acpi-build.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index a26a4bb..433feba 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -789,7 +789,7 @@ static gint crs_range_compare(gconstpointer a, gconstpointer b)
 static void crs_replace_with_free_ranges(GPtrArray *ranges,
                                          uint64_t start, uint64_t end)
 {
-    GPtrArray *free_ranges = g_ptr_array_new_with_free_func(crs_range_free);
+    GPtrArray *free_ranges = g_ptr_array_new();
     uint64_t free_base = start;
     int i;
 
@@ -813,7 +813,7 @@ static void crs_replace_with_free_ranges(GPtrArray *ranges,
         g_ptr_array_add(ranges, g_ptr_array_index(free_ranges, i));
     }
 
-    g_ptr_array_free(free_ranges, false);
+    g_ptr_array_free(free_ranges, true);
 }
 
 /*
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 16/25] tests: fix qom-test leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (14 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 15/25] acpi-build: fix array leak Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 17/25] pc: free i8259 Marc-André Lureau
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qom-test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tests/qom-test.c b/tests/qom-test.c
index 23493a2..d48f890 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -115,7 +115,7 @@ static void add_machine_test_cases(void)
     const QListEntry *p;
     QObject *qobj;
     QString *qstr;
-    const char *mname, *path;
+    const char *mname;
 
     qtest_start("-machine none");
     response = qmp("{ 'execute': 'query-machines' }");
@@ -132,8 +132,9 @@ static void add_machine_test_cases(void)
         g_assert(qstr);
         mname = qstring_get_str(qstr);
         if (!is_blacklisted(arch, mname)) {
-            path = g_strdup_printf("qom/%s", mname);
+            char *path = g_strdup_printf("qom/%s", mname);
             qtest_add_data_func(path, g_strdup(mname), test_machine);
+            g_free(path);
         }
     }
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 17/25] pc: free i8259
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (15 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 16/25] tests: fix qom-test leaks Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 18/25] pc: keep gsi reference Marc-André Lureau
                   ` (8 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Simiarly to 2ba154cf4eb8636cdd3aa90f392ca9e77206ca39

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
---
 hw/i386/pc_q35.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index c0b9961..c5e8367 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -213,6 +213,8 @@ static void pc_q35_init(MachineState *machine)
     for (i = 0; i < ISA_NUM_IRQS; i++) {
         gsi_state->i8259_irq[i] = i8259[i];
     }
+    g_free(i8259);
+
     if (pcmc->pci_enabled) {
         ioapic_init_gsi(gsi_state, "q35");
     }
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 18/25] pc: keep gsi reference
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (16 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 17/25] pc: free i8259 Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 19/25] sd: free timer Marc-André Lureau
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Further cleanup would need to call qemu_free_irq() at the appropriate
time, but for now this silences ASAN about direct leaks.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
 hw/i386/pc_piix.c    | 17 ++++++++---------
 hw/i386/pc_q35.c     | 13 ++++++-------
 include/hw/i386/pc.h |  1 +
 3 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index a07dc81..2af8888 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -74,7 +74,6 @@ static void pc_init1(MachineState *machine,
     ISABus *isa_bus;
     PCII440FXState *i440fx_state;
     int piix3_devfn = -1;
-    qemu_irq *gsi;
     qemu_irq *i8259;
     qemu_irq smi_irq;
     GSIState *gsi_state;
@@ -185,16 +184,16 @@ static void pc_init1(MachineState *machine,
     gsi_state = g_malloc0(sizeof(*gsi_state));
     if (kvm_ioapic_in_kernel()) {
         kvm_pc_setup_irq_routing(pcmc->pci_enabled);
-        gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
-                                 GSI_NUM_PINS);
+        pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
+                                       GSI_NUM_PINS);
     } else {
-        gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
+        pcms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
     }
 
     if (pcmc->pci_enabled) {
         pci_bus = i440fx_init(host_type,
                               pci_type,
-                              &i440fx_state, &piix3_devfn, &isa_bus, gsi,
+                              &i440fx_state, &piix3_devfn, &isa_bus, pcms->gsi,
                               system_memory, system_io, machine->ram_size,
                               pcms->below_4g_mem_size,
                               pcms->above_4g_mem_size,
@@ -207,7 +206,7 @@ static void pc_init1(MachineState *machine,
                               &error_abort);
         no_hpet = 1;
     }
-    isa_bus_irqs(isa_bus, gsi);
+    isa_bus_irqs(isa_bus, pcms->gsi);
 
     if (kvm_pic_in_kernel()) {
         i8259 = kvm_i8259_init(isa_bus);
@@ -225,7 +224,7 @@ static void pc_init1(MachineState *machine,
         ioapic_init_gsi(gsi_state, "i440fx");
     }
 
-    pc_register_ferr_irq(gsi[13]);
+    pc_register_ferr_irq(pcms->gsi[13]);
 
     pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
 
@@ -235,7 +234,7 @@ static void pc_init1(MachineState *machine,
     }
 
     /* init basic PC hardware */
-    pc_basic_device_init(isa_bus, gsi, &rtc_state, true,
+    pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, true,
                          (pcms->vmport != ON_OFF_AUTO_ON), 0x4);
 
     pc_nic_init(isa_bus, pci_bus);
@@ -279,7 +278,7 @@ static void pc_init1(MachineState *machine,
         smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
         /* TODO: Populate SPD eeprom data.  */
         smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
-                              gsi[9], smi_irq,
+                              pcms->gsi[9], smi_irq,
                               pc_machine_is_smm_enabled(pcms),
                               &piix4_pm);
         smbus_eeprom_init(smbus, 8, NULL, 0);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index c5e8367..3cbcbb0 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -69,7 +69,6 @@ static void pc_q35_init(MachineState *machine)
     MemoryRegion *ram_memory;
     GSIState *gsi_state;
     ISABus *isa_bus;
-    qemu_irq *gsi;
     qemu_irq *i8259;
     int i;
     ICH9LPCState *ich9_lpc;
@@ -153,10 +152,10 @@ static void pc_q35_init(MachineState *machine)
     gsi_state = g_malloc0(sizeof(*gsi_state));
     if (kvm_ioapic_in_kernel()) {
         kvm_pc_setup_irq_routing(pcmc->pci_enabled);
-        gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
-                                 GSI_NUM_PINS);
+        pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
+                                       GSI_NUM_PINS);
     } else {
-        gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
+        pcms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
     }
 
     /* create pci host bus */
@@ -195,7 +194,7 @@ static void pc_q35_init(MachineState *machine)
     ich9_lpc = ICH9_LPC_DEVICE(lpc);
     lpc_dev = DEVICE(lpc);
     for (i = 0; i < GSI_NUM_PINS; i++) {
-        qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, gsi[i]);
+        qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, pcms->gsi[i]);
     }
     pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc,
                  ICH9_LPC_NB_PIRQS);
@@ -219,7 +218,7 @@ static void pc_q35_init(MachineState *machine)
         ioapic_init_gsi(gsi_state, "q35");
     }
 
-    pc_register_ferr_irq(gsi[13]);
+    pc_register_ferr_irq(pcms->gsi[13]);
 
     assert(pcms->vmport != ON_OFF_AUTO__MAX);
     if (pcms->vmport == ON_OFF_AUTO_AUTO) {
@@ -227,7 +226,7 @@ static void pc_q35_init(MachineState *machine)
     }
 
     /* init basic PC hardware */
-    pc_basic_device_init(isa_bus, gsi, &rtc_state, !mc->no_floppy,
+    pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, !mc->no_floppy,
                          (pcms->vmport != ON_OFF_AUTO_ON), 0xff0104);
 
     /* connect pm stuff to lpc */
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 422fac7..c4316c3 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -53,6 +53,7 @@ struct PCMachineState {
     ISADevice *rtc;
     PCIBus *bus;
     FWCfgState *fw_cfg;
+    qemu_irq *gsi;
 
     /* Configuration options: */
     uint64_t max_ram_below_4g;
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 19/25] sd: free timer
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (17 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 18/25] pc: keep gsi reference Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 20/25] ipmi: free extern timer Marc-André Lureau
                   ` (6 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Free the timer allocated in instance_init.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
---
 hw/sd/sd.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 87c6dc1..8e88e83 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1876,6 +1876,14 @@ static void sd_instance_init(Object *obj)
     sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd);
 }
 
+static void sd_instance_finalize(Object *obj)
+{
+    SDState *sd = SD_CARD(obj);
+
+    timer_del(sd->ocr_power_timer);
+    timer_free(sd->ocr_power_timer);
+}
+
 static void sd_realize(DeviceState *dev, Error **errp)
 {
     SDState *sd = SD_CARD(dev);
@@ -1927,6 +1935,7 @@ static const TypeInfo sd_info = {
     .class_size = sizeof(SDCardClass),
     .class_init = sd_class_init,
     .instance_init = sd_instance_init,
+    .instance_finalize = sd_instance_finalize,
 };
 
 static void sd_register_types(void)
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 20/25] ipmi: free extern timer
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (18 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 19/25] sd: free timer Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 21/25] bus: simplify name handling Marc-André Lureau
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Free the timer allocated during instance init.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Corey Minyard <cminyard@mvista.com>
---
 hw/ipmi/ipmi_bmc_extern.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c
index 157879e..5b73983 100644
--- a/hw/ipmi/ipmi_bmc_extern.c
+++ b/hw/ipmi/ipmi_bmc_extern.c
@@ -487,6 +487,14 @@ static void ipmi_bmc_extern_init(Object *obj)
     vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe);
 }
 
+static void ipmi_bmc_extern_finalize(Object *obj)
+{
+    IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj);
+
+    timer_del(ibe->extern_timer);
+    timer_free(ibe->extern_timer);
+}
+
 static Property ipmi_bmc_extern_properties[] = {
     DEFINE_PROP_CHR("chardev", IPMIBmcExtern, chr),
     DEFINE_PROP_END_OF_LIST(),
@@ -508,6 +516,7 @@ static const TypeInfo ipmi_bmc_extern_type = {
     .parent        = TYPE_IPMI_BMC,
     .instance_size = sizeof(IPMIBmcExtern),
     .instance_init = ipmi_bmc_extern_init,
+    .instance_finalize = ipmi_bmc_extern_finalize,
     .class_init    = ipmi_bmc_extern_class_init,
  };
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 21/25] bus: simplify name handling
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (19 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 20/25] ipmi: free extern timer Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 22/25] tests: add qtest_add_data_func_full Marc-André Lureau
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Simplify a bit the code by using g_strdup_printf() and store it in a
non-const value so casting is no longer needed, and ownership is
clearer.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 hw/core/bus.c          | 21 ++++++---------------
 include/hw/qdev-core.h |  2 +-
 2 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/hw/core/bus.c b/hw/core/bus.c
index 3e3f8ac..cf383fc 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -78,8 +78,7 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
 {
     const char *typename = object_get_typename(OBJECT(bus));
     BusClass *bc;
-    char *buf;
-    int i, len, bus_id;
+    int i, bus_id;
 
     bus->parent = parent;
 
@@ -88,23 +87,15 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
     } else if (bus->parent && bus->parent->id) {
         /* parent device has id -> use it plus parent-bus-id for bus name */
         bus_id = bus->parent->num_child_bus;
-
-        len = strlen(bus->parent->id) + 16;
-        buf = g_malloc(len);
-        snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
-        bus->name = buf;
+        bus->name = g_strdup_printf("%s.%d", bus->parent->id, bus_id);
     } else {
         /* no id -> use lowercase bus type plus global bus-id for bus name */
         bc = BUS_GET_CLASS(bus);
         bus_id = bc->automatic_ids++;
-
-        len = strlen(typename) + 16;
-        buf = g_malloc(len);
-        len = snprintf(buf, len, "%s.%d", typename, bus_id);
-        for (i = 0; i < len; i++) {
-            buf[i] = qemu_tolower(buf[i]);
+        bus->name = g_strdup_printf("%s.%d", typename, bus_id);
+        for (i = 0; bus->name[i]; i++) {
+            bus->name[i] = qemu_tolower(bus->name[i]);
         }
-        bus->name = buf;
     }
 
     if (bus->parent) {
@@ -229,7 +220,7 @@ static void qbus_finalize(Object *obj)
 {
     BusState *bus = BUS(obj);
 
-    g_free((char *)bus->name);
+    g_free(bus->name);
 }
 
 static const TypeInfo bus_info = {
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 4b4b33b..2c97347 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -224,7 +224,7 @@ typedef struct BusChild {
 struct BusState {
     Object obj;
     DeviceState *parent;
-    const char *name;
+    char *name;
     HotplugHandler *hotplug_handler;
     int max_index;
     bool realized;
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 22/25] tests: add qtest_add_data_func_full
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (20 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 21/25] bus: simplify name handling Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 23/25] tests: pc-cpu-test leaks fixes Marc-André Lureau
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

Allows one to specify a destroy function for the test data.

Add a fallback using glib g_test_add_vtable() internal function, whose
signature changed over time. Tested with glib 2.22, 2.26 and 2.48, which
according to git log should be enough to cover all variations.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.c | 19 +++++++++++++++++++
 tests/libqtest.h | 17 +++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index eb00f13..42ccb62 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -758,6 +758,25 @@ void qtest_add_func(const char *str, void (*fn)(void))
     g_free(path);
 }
 
+void qtest_add_data_func_full(const char *str, void *data,
+                              void (*fn)(const void *),
+                              GDestroyNotify data_free_func)
+{
+    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
+#if GLIB_CHECK_VERSION(2, 34, 0)
+    g_test_add_data_func_full(path, data, fn, data_free_func);
+#elif GLIB_CHECK_VERSION(2, 26, 0)
+    /* back-compat casts, remove this once we can require new-enough glib */
+    g_test_add_vtable(path, 0, data, NULL,
+                      (GTestFixtureFunc)fn, (GTestFixtureFunc) data_free_func);
+#else
+    /* back-compat casts, remove this once we can require new-enough glib */
+    g_test_add_vtable(path, 0, data, NULL,
+                      (void (*)(void)) fn, (void (*)(void)) data_free_func);
+#endif
+    g_free(path);
+}
+
 void qtest_add_data_func(const char *str, const void *data,
                          void (*fn)(const void *))
 {
diff --git a/tests/libqtest.h b/tests/libqtest.h
index 37f37ad..d2b4853 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -425,6 +425,23 @@ void qtest_add_func(const char *str, void (*fn)(void));
 void qtest_add_data_func(const char *str, const void *data,
                          void (*fn)(const void *));
 
+/**
+ * qtest_add_data_func_full:
+ * @str: Test case path.
+ * @data: Test case data
+ * @fn: Test case function
+ * @data_free_func: GDestroyNotify for data
+ *
+ * Add a GTester testcase with the given name, data and function.
+ * The path is prefixed with the architecture under test, as
+ * returned by qtest_get_arch().
+ *
+ * @data is passed to @data_free_func() on test completion.
+ */
+void qtest_add_data_func_full(const char *str, void *data,
+                              void (*fn)(const void *),
+                              GDestroyNotify data_free_func);
+
 /**
  * qtest_add:
  * @testpath: Test case path
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 23/25] tests: pc-cpu-test leaks fixes
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (21 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 22/25] tests: add qtest_add_data_func_full Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 24/25] tests: fix rsp leak in postcopy-test Marc-André Lureau
                   ` (2 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

The path is allocated and should be freed.

The qmp response should be unref, but then 'machine' must be duplicated.

Use a destroy function for the PCTestData.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/pc-cpu-test.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c
index 4428cea..c3a2633 100644
--- a/tests/pc-cpu-test.c
+++ b/tests/pc-cpu-test.c
@@ -14,7 +14,7 @@
 #include "qapi/qmp/types.h"
 
 struct PCTestData {
-    const char *machine;
+    char *machine;
     const char *cpu_model;
     unsigned sockets;
     unsigned cores;
@@ -71,6 +71,14 @@ static void test_pc_without_cpu_add(gconstpointer data)
     g_free(args);
 }
 
+static void test_data_free(gpointer data)
+{
+    PCTestData *pc = data;
+
+    g_free(pc->machine);
+    g_free(pc);
+}
+
 static void add_pc_test_cases(void)
 {
     QDict *response, *minfo;
@@ -78,7 +86,8 @@ static void add_pc_test_cases(void)
     const QListEntry *p;
     QObject *qobj;
     QString *qstr;
-    const char *mname, *path;
+    const char *mname;
+    char *path;
     PCTestData *data;
 
     qtest_start("-machine none");
@@ -99,7 +108,7 @@ static void add_pc_test_cases(void)
             continue;
         }
         data = g_malloc(sizeof(PCTestData));
-        data->machine = mname;
+        data->machine = g_strdup(mname);
         data->cpu_model = "Haswell"; /* 1.3+ theoretically */
         data->sockets = 1;
         data->cores = 3;
@@ -119,14 +128,19 @@ static void add_pc_test_cases(void)
             path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
                                    mname, data->sockets, data->cores,
                                    data->threads, data->maxcpus);
-            qtest_add_data_func(path, data, test_pc_without_cpu_add);
+            qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
+                                     test_data_free);
+            g_free(path);
         } else {
             path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
                                    mname, data->sockets, data->cores,
                                    data->threads, data->maxcpus);
-            qtest_add_data_func(path, data, test_pc_with_cpu_add);
+            qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
+                                     test_data_free);
+            g_free(path);
         }
     }
+    QDECREF(response);
     qtest_end();
 }
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 24/25] tests: fix rsp leak in postcopy-test
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (22 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 23/25] tests: pc-cpu-test leaks fixes Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 25/25] tests: fix postcopy-test leaks Marc-André Lureau
  2016-09-09 10:07 ` [Qemu-devel] [PULLv2 00/25] Leak patches Peter Maydell
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

In all cases, even when the dict doesn't contain 'ram', the qmp response
must be unref.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/postcopy-test.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index 229e9e9..bf4e579 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -260,8 +260,8 @@ static uint64_t get_migration_pass(void)
     } else {
         rsp_ram = qdict_get_qdict(rsp_return, "ram");
         result = qdict_get_try_int(rsp_ram, "dirty-sync-count", 0);
-        QDECREF(rsp);
     }
+    QDECREF(rsp);
     return result;
 }
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [Qemu-devel] [PULLv2 25/25] tests: fix postcopy-test leaks
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (23 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 24/25] tests: fix rsp leak in postcopy-test Marc-André Lureau
@ 2016-09-08 14:17 ` Marc-André Lureau
  2016-09-09 10:07 ` [Qemu-devel] [PULLv2 00/25] Leak patches Peter Maydell
  25 siblings, 0 replies; 27+ messages in thread
From: Marc-André Lureau @ 2016-09-08 14:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, eblake, armbru, pbonzini, Marc-André Lureau

A few strings are allocated and never freed.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/postcopy-test.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index bf4e579..41ed1a9 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -176,6 +176,7 @@ static void wait_for_serial(const char *side)
     int started = (strcmp(side, "src_serial") == 0 &&
                    strcmp(arch, "ppc64") == 0) ? 0 : 1;
 
+    g_free(serialpath);
     do {
         int readvalue = fgetc(serialfile);
 
@@ -203,7 +204,6 @@ static void wait_for_serial(const char *side)
         case 'B':
             /* It's alive! */
             fclose(serialfile);
-            g_free(serialpath);
             return;
 
         case EOF:
@@ -350,6 +350,7 @@ static void cleanup(const char *filename)
     char *path = g_strdup_printf("%s/%s", tmpfs, filename);
 
     unlink(path);
+    g_free(path);
 }
 
 static void test_migrate(void)
@@ -394,6 +395,8 @@ static void test_migrate(void)
         g_assert_not_reached();
     }
 
+    g_free(bootpath);
+
     from = qtest_start(cmd_src);
     g_free(cmd_src);
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* Re: [Qemu-devel] [PULLv2 00/25] Leak patches
  2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
                   ` (24 preceding siblings ...)
  2016-09-08 14:17 ` [Qemu-devel] [PULLv2 25/25] tests: fix postcopy-test leaks Marc-André Lureau
@ 2016-09-09 10:07 ` Peter Maydell
  25 siblings, 0 replies; 27+ messages in thread
From: Peter Maydell @ 2016-09-09 10:07 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: QEMU Developers, Eric Blake, Markus Armbruster, Paolo Bonzini

On 8 September 2016 at 15:16, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
> The following changes since commit 59351d9b40b1de0fb77e1ff3e53faa04c995c707:
>
>   Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.8-20160907' into staging (2016-09-08 11:28:12 +0100)
>
> are available in the git repository at:
>
>   git@github.com:elmarco/qemu.git tags/leak-pull-request
>
> for you to fetch changes up to e2dd21e510ed66daeb4c5d58638450c1fb8c6fea:
>
>   tests: fix postcopy-test leaks (2016-09-08 18:05:22 +0400)
>
> ----------------------------------------------------------------
> Pull request
>
> v2:
> - dropped "tests: fix small leak in test-io-channel-command" that Daniel Berrange will pick
> - fixed "tests: add qtest_add_data_func_full" to work with glib < 2.26
>
> ----------------------------------------------------------------
>

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2016-09-09 10:07 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-08 14:16 [Qemu-devel] [PULLv2 00/25] Leak patches Marc-André Lureau
2016-09-08 14:16 ` [Qemu-devel] [PULLv2 01/25] tests: fix test-qga leaks Marc-André Lureau
2016-09-08 14:16 ` [Qemu-devel] [PULLv2 02/25] glib-compat: add g_(s)list_free_full() Marc-André Lureau
2016-09-08 14:16 ` [Qemu-devel] [PULLv2 03/25] qga: free the whole blacklist Marc-André Lureau
2016-09-08 14:16 ` [Qemu-devel] [PULLv2 04/25] qga: free remaining leaking state Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 05/25] tests: fix test-cutils leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 06/25] tests: fix test-vmstate leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 07/25] tests: fix test-iov leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 08/25] tests: fix check-qom-interface leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 09/25] tests: fix check-qom-proplist leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 10/25] tests: fix leak in test-string-input-visitor Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 11/25] portio: keep references on portio Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 12/25] pc: simplify passing qemu_irq Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 13/25] pc: don't leak a20_line Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 14/25] machine: use class base init generated name Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 15/25] acpi-build: fix array leak Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 16/25] tests: fix qom-test leaks Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 17/25] pc: free i8259 Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 18/25] pc: keep gsi reference Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 19/25] sd: free timer Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 20/25] ipmi: free extern timer Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 21/25] bus: simplify name handling Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 22/25] tests: add qtest_add_data_func_full Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 23/25] tests: pc-cpu-test leaks fixes Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 24/25] tests: fix rsp leak in postcopy-test Marc-André Lureau
2016-09-08 14:17 ` [Qemu-devel] [PULLv2 25/25] tests: fix postcopy-test leaks Marc-André Lureau
2016-09-09 10:07 ` [Qemu-devel] [PULLv2 00/25] Leak patches Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).