diff mbox

[v2,06/30] tests: fix ptimer leaks

Message ID 20170221141451.28305-7-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau Feb. 21, 2017, 2:14 p.m. UTC
Spotted by ASAN.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/ptimer.h       |   1 +
 hw/core/ptimer.c          |   8 +++
 tests/ptimer-test-stubs.c |   5 ++
 tests/ptimer-test.c       | 122 ++++++++++++++++++++++++++++------------------
 4 files changed, 89 insertions(+), 47 deletions(-)

Comments

Paolo Bonzini Feb. 22, 2017, 11:33 a.m. UTC | #1
On 21/02/2017 15:14, Marc-André Lureau wrote:
> Spotted by ASAN.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/ptimer.h       |   1 +
>  hw/core/ptimer.c          |   8 +++
>  tests/ptimer-test-stubs.c |   5 ++
>  tests/ptimer-test.c       | 122 ++++++++++++++++++++++++++++------------------
>  4 files changed, 89 insertions(+), 47 deletions(-)
> 
> diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
> index 48cccbdb51..eafc3f0a86 100644
> --- a/include/hw/ptimer.h
> +++ b/include/hw/ptimer.h
> @@ -60,6 +60,7 @@ typedef struct ptimer_state ptimer_state;
>  typedef void (*ptimer_cb)(void *opaque);
>  
>  ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
> +void ptimer_free(ptimer_state *s);
>  void ptimer_set_period(ptimer_state *s, int64_t period);
>  void ptimer_set_freq(ptimer_state *s, uint32_t freq);
>  uint64_t ptimer_get_limit(ptimer_state *s);
> diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
> index 3af82afe78..59ccb00550 100644
> --- a/hw/core/ptimer.c
> +++ b/hw/core/ptimer.c
> @@ -12,6 +12,7 @@
>  #include "qemu/host-utils.h"
>  #include "sysemu/replay.h"
>  #include "sysemu/qtest.h"
> +#include "block/aio.h"
>  
>  #define DELTA_ADJUST     1
>  #define DELTA_NO_ADJUST -1
> @@ -353,3 +354,10 @@ ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
>      s->policy_mask = policy_mask;
>      return s;
>  }
> +
> +void ptimer_free(ptimer_state *s)
> +{
> +    qemu_bh_delete(s->bh);
> +    timer_free(s->timer);
> +    g_free(s);
> +}
> diff --git a/tests/ptimer-test-stubs.c b/tests/ptimer-test-stubs.c
> index 21d4ebb0fe..8a1b0a336c 100644
> --- a/tests/ptimer-test-stubs.c
> +++ b/tests/ptimer-test-stubs.c
> @@ -108,6 +108,11 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
>      return bh;
>  }
>  
> +void qemu_bh_delete(QEMUBH *bh)
> +{
> +    g_free(bh);
> +}
> +
>  void replay_bh_schedule_event(QEMUBH *bh)
>  {
>      bh->cb(bh->opaque);
> diff --git a/tests/ptimer-test.c b/tests/ptimer-test.c
> index b36a476483..5d1a2a8188 100644
> --- a/tests/ptimer-test.c
> +++ b/tests/ptimer-test.c
> @@ -73,6 +73,7 @@ static void check_set_count(gconstpointer arg)
>      ptimer_set_count(ptimer, 1000);
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_set_limit(gconstpointer arg)
> @@ -92,6 +93,7 @@ static void check_set_limit(gconstpointer arg)
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
>      g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_oneshot(gconstpointer arg)
> @@ -194,6 +196,7 @@ static void check_oneshot(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_periodic(gconstpointer arg)
> @@ -360,6 +363,7 @@ static void check_periodic(gconstpointer arg)
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==,
>                      (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_mode_change(gconstpointer arg)
> @@ -406,6 +410,7 @@ static void check_on_the_fly_mode_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_period_change(gconstpointer arg)
> @@ -438,6 +443,7 @@ static void check_on_the_fly_period_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_freq_change(gconstpointer arg)
> @@ -470,6 +476,7 @@ static void check_on_the_fly_freq_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_run_with_period_0(gconstpointer arg)
> @@ -487,6 +494,7 @@ static void check_run_with_period_0(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_run_with_delta_0(gconstpointer arg)
> @@ -591,6 +599,7 @@ static void check_run_with_delta_0(gconstpointer arg)
>      g_assert_true(triggered);
>  
>      ptimer_stop(ptimer);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_periodic_with_load_0(gconstpointer arg)
> @@ -649,6 +658,7 @@ static void check_periodic_with_load_0(gconstpointer arg)
>      }
>  
>      ptimer_stop(ptimer);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_oneshot_with_load_0(gconstpointer arg)
> @@ -682,14 +692,14 @@ static void check_oneshot_with_load_0(gconstpointer arg)
>      } else {
>          g_assert_false(triggered);
>      }
> +
> +    ptimer_free(ptimer);
>  }
>  
>  static void add_ptimer_tests(uint8_t policy)
>  {
> -    uint8_t *ppolicy = g_malloc(1);
> -    char *policy_name = g_malloc0(256);
> -
> -    *ppolicy = policy;
> +    char policy_name[256] = "";
> +    char *tmp;
>  
>      if (policy == PTIMER_POLICY_DEFAULT) {
>          g_sprintf(policy_name, "default");
> @@ -715,49 +725,67 @@ static void add_ptimer_tests(uint8_t policy)
>          g_strlcat(policy_name, "no_counter_rounddown,", 256);
>      }
>  
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
> -        ppolicy, check_set_count);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
> -        ppolicy, check_set_limit);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
> -        ppolicy, check_oneshot);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
> -        ppolicy, check_periodic);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_mode_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_period_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_freq_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
> -        ppolicy, check_run_with_period_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
> -        ppolicy, check_run_with_delta_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
> -        ppolicy, check_periodic_with_load_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
> -        ppolicy, check_oneshot_with_load_0);
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_set_count, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_set_limit, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_oneshot, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_periodic, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_run_with_period_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_run_with_delta_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
> +    g_free(tmp);
>  }
>  
>  static void add_all_ptimer_policies_comb_tests(void)
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
diff mbox

Patch

diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
index 48cccbdb51..eafc3f0a86 100644
--- a/include/hw/ptimer.h
+++ b/include/hw/ptimer.h
@@ -60,6 +60,7 @@  typedef struct ptimer_state ptimer_state;
 typedef void (*ptimer_cb)(void *opaque);
 
 ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
+void ptimer_free(ptimer_state *s);
 void ptimer_set_period(ptimer_state *s, int64_t period);
 void ptimer_set_freq(ptimer_state *s, uint32_t freq);
 uint64_t ptimer_get_limit(ptimer_state *s);
diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
index 3af82afe78..59ccb00550 100644
--- a/hw/core/ptimer.c
+++ b/hw/core/ptimer.c
@@ -12,6 +12,7 @@ 
 #include "qemu/host-utils.h"
 #include "sysemu/replay.h"
 #include "sysemu/qtest.h"
+#include "block/aio.h"
 
 #define DELTA_ADJUST     1
 #define DELTA_NO_ADJUST -1
@@ -353,3 +354,10 @@  ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
     s->policy_mask = policy_mask;
     return s;
 }
+
+void ptimer_free(ptimer_state *s)
+{
+    qemu_bh_delete(s->bh);
+    timer_free(s->timer);
+    g_free(s);
+}
diff --git a/tests/ptimer-test-stubs.c b/tests/ptimer-test-stubs.c
index 21d4ebb0fe..8a1b0a336c 100644
--- a/tests/ptimer-test-stubs.c
+++ b/tests/ptimer-test-stubs.c
@@ -108,6 +108,11 @@  QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
     return bh;
 }
 
+void qemu_bh_delete(QEMUBH *bh)
+{
+    g_free(bh);
+}
+
 void replay_bh_schedule_event(QEMUBH *bh)
 {
     bh->cb(bh->opaque);
diff --git a/tests/ptimer-test.c b/tests/ptimer-test.c
index b36a476483..5d1a2a8188 100644
--- a/tests/ptimer-test.c
+++ b/tests/ptimer-test.c
@@ -73,6 +73,7 @@  static void check_set_count(gconstpointer arg)
     ptimer_set_count(ptimer, 1000);
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
     g_assert_false(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_set_limit(gconstpointer arg)
@@ -92,6 +93,7 @@  static void check_set_limit(gconstpointer arg)
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
     g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
     g_assert_false(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_oneshot(gconstpointer arg)
@@ -194,6 +196,7 @@  static void check_oneshot(gconstpointer arg)
 
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
     g_assert_false(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_periodic(gconstpointer arg)
@@ -360,6 +363,7 @@  static void check_periodic(gconstpointer arg)
     g_assert_cmpuint(ptimer_get_count(ptimer), ==,
                     (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
     g_assert_false(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_on_the_fly_mode_change(gconstpointer arg)
@@ -406,6 +410,7 @@  static void check_on_the_fly_mode_change(gconstpointer arg)
 
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
     g_assert_true(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_on_the_fly_period_change(gconstpointer arg)
@@ -438,6 +443,7 @@  static void check_on_the_fly_period_change(gconstpointer arg)
 
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
     g_assert_true(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_on_the_fly_freq_change(gconstpointer arg)
@@ -470,6 +476,7 @@  static void check_on_the_fly_freq_change(gconstpointer arg)
 
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
     g_assert_true(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_run_with_period_0(gconstpointer arg)
@@ -487,6 +494,7 @@  static void check_run_with_period_0(gconstpointer arg)
 
     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
     g_assert_false(triggered);
+    ptimer_free(ptimer);
 }
 
 static void check_run_with_delta_0(gconstpointer arg)
@@ -591,6 +599,7 @@  static void check_run_with_delta_0(gconstpointer arg)
     g_assert_true(triggered);
 
     ptimer_stop(ptimer);
+    ptimer_free(ptimer);
 }
 
 static void check_periodic_with_load_0(gconstpointer arg)
@@ -649,6 +658,7 @@  static void check_periodic_with_load_0(gconstpointer arg)
     }
 
     ptimer_stop(ptimer);
+    ptimer_free(ptimer);
 }
 
 static void check_oneshot_with_load_0(gconstpointer arg)
@@ -682,14 +692,14 @@  static void check_oneshot_with_load_0(gconstpointer arg)
     } else {
         g_assert_false(triggered);
     }
+
+    ptimer_free(ptimer);
 }
 
 static void add_ptimer_tests(uint8_t policy)
 {
-    uint8_t *ppolicy = g_malloc(1);
-    char *policy_name = g_malloc0(256);
-
-    *ppolicy = policy;
+    char policy_name[256] = "";
+    char *tmp;
 
     if (policy == PTIMER_POLICY_DEFAULT) {
         g_sprintf(policy_name, "default");
@@ -715,49 +725,67 @@  static void add_ptimer_tests(uint8_t policy)
         g_strlcat(policy_name, "no_counter_rounddown,", 256);
     }
 
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
-        ppolicy, check_set_count);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
-        ppolicy, check_set_limit);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
-        ppolicy, check_oneshot);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
-        ppolicy, check_periodic);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
-        ppolicy, check_on_the_fly_mode_change);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
-        ppolicy, check_on_the_fly_period_change);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
-        ppolicy, check_on_the_fly_freq_change);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
-        ppolicy, check_run_with_period_0);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
-        ppolicy, check_run_with_delta_0);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
-        ppolicy, check_periodic_with_load_0);
-
-    g_test_add_data_func(
-        g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
-        ppolicy, check_oneshot_with_load_0);
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
+        g_memdup(&policy, 1), check_set_count, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
+        g_memdup(&policy, 1), check_set_limit, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
+        g_memdup(&policy, 1), check_oneshot, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
+        g_memdup(&policy, 1), check_periodic, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_run_with_period_0, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_run_with_delta_0, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
+    g_free(tmp);
+
+    g_test_add_data_func_full(
+        tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
+                              policy_name),
+        g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
+    g_free(tmp);
 }
 
 static void add_all_ptimer_policies_comb_tests(void)