[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks |
Date: |
Wed, 22 Feb 2017 12:33:51 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 21/02/2017 15:14, Marc-André Lureau wrote:
> Spotted by ASAN.
>
> Cc: Paolo Bonzini <address@hidden>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
> 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 <address@hidden>
- [Qemu-devel] [PATCH v2 00/30] Various memory leak fixes, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 01/30] qtest: fix a memory leak, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 02/30] tests: fix qmp response leak, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 04/30] timer: use an inline function for free, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 03/30] tests: fix leaks in test-io-channel-command, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 05/30] glib-compat: add g_test_add_data_func_full fallback, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks, Marc-André Lureau, 2017/02/21
- Re: [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 08/30] tests: fix q35-test leaks, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 07/30] tests: fix endianness-test leaks, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 09/30] tests: fix vhost-user-test leaks, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 10/30] tests: fix ide-test leaks, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 11/30] tests: fix hd-geo-test leaks, Marc-André Lureau, 2017/02/21
- [Qemu-devel] [PATCH v2 12/30] tests: fix bios-tables-test leak, Marc-André Lureau, 2017/02/21