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)
--
2.11.0.295.gd7dffce1c.dirty
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>
© 2016 - 2026 Red Hat, Inc.