Message ID | 20170221141451.28305-7-marcandre.lureau@redhat.com |
---|---|
State | New |
Headers | show |
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 --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)
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(-)