diff options
| author | Haibo Huang <hhb@google.com> | 2020-07-10 20:21:19 -0700 |
|---|---|---|
| committer | Haibo Huang <hhb@google.com> | 2020-07-10 20:21:19 -0700 |
| commit | f0077b80a031634c5c62cffa0a238923db77d45a (patch) | |
| tree | 53915fc3eafdda183ab94c84e85ad7d7107afc6a /test/regress_finalize.c | |
| parent | 66d97fce6163bdd40a7bd2324225021838f3f18c (diff) | |
| download | platform_external_libevent-f0077b80a031634c5c62cffa0a238923db77d45a.tar.gz platform_external_libevent-f0077b80a031634c5c62cffa0a238923db77d45a.tar.bz2 platform_external_libevent-f0077b80a031634c5c62cffa0a238923db77d45a.zip | |
Upgrade libevent to release-2.1.12-stableandroid-r-beta-3android-r-beta-2
Change-Id: Id26c13a4fc1e140627d8869de2b6e2929f8a2a7b
Diffstat (limited to 'test/regress_finalize.c')
| -rw-r--r-- | test/regress_finalize.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/test/regress_finalize.c b/test/regress_finalize.c index 552210f..9e57188 100644 --- a/test/regress_finalize.c +++ b/test/regress_finalize.c @@ -290,6 +290,53 @@ end: ; } +static void +event_finalize_callback_free(struct event *ev, void *arg) +{ + struct event_base *base = arg; + int err; + if (base) { + err = event_assign(ev, base, -1, EV_TIMEOUT, NULL, NULL); + tt_int_op(err, ==, 0); + test_ok += 1; + } else { + free(ev); + test_ok += 1; + } + +end: + ; +} +static void +test_fin_debug_use_after_free(void *arg) +{ + struct basic_test_data *data = arg; + struct event_base *base = data->base; + struct event *ev; + + tt_ptr_op(ev = event_new(base, -1, EV_TIMEOUT, NULL, base), !=, NULL); + tt_int_op(event_add(ev, NULL), ==, 0); + tt_int_op(event_finalize(0, ev, event_finalize_callback_free), ==, 0); + + // Dispatch base to trigger callbacks + event_base_dispatch(base); + event_base_assert_ok_(base); + tt_int_op(test_ok, ==, 1); + + // Now add again, since we did event_assign in event_finalize_callback_free + // This used to fail in event_debug_assert_is_setup_ + tt_int_op(event_add(ev, NULL), ==, 0); + + // Finalize and dispatch again + tt_int_op(event_finalize(0, ev, event_finalize_callback_free), ==, 0); + event_base_dispatch(base); + event_base_assert_ok_(base); + tt_int_op(test_ok, ==, 2); + +end: + ; +} + #if 0 static void timer_callback_3(evutil_socket_t *fd, short what, void *arg) @@ -339,6 +386,7 @@ struct testcase_t finalize_testcases[] = { TEST(cb_invoked, TT_FORK|TT_NEED_BASE), TEST(free_finalize, TT_FORK), TEST(within_cb, TT_FORK|TT_NEED_BASE), + TEST(debug_use_after_free, TT_FORK|TT_NEED_BASE|TT_ENABLE_DEBUG_MODE), // TEST(many, TT_FORK|TT_NEED_BASE), |
