diff options
author | Azat Khuzhin <azat@libevent.org> | 2020-07-05 11:59:32 +0300 |
---|---|---|
committer | Azat Khuzhin <azat@libevent.org> | 2020-07-05 12:16:52 +0300 |
commit | 90bcf2d660b9b43cb8e747421d4938f08f935bd7 (patch) | |
tree | d3c40d326d5138c575a83daea7da3256c6e40d69 /test | |
parent | ba19b356bf8a9be2a5bddfa264dee61ffc9573a7 (diff) | |
download | libevent-90bcf2d660b9b43cb8e747421d4938f08f935bd7.tar.gz |
test: fix leak in dns/getaddrinfo_cancel_stress
Some requests may get response (evutil_addrinfo) from gaic_server_cb,
in case of cancel_event (10000ms) will not be fast enough.
Diffstat (limited to 'test')
-rw-r--r-- | test/regress_dns.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/test/regress_dns.c b/test/regress_dns.c index c19604a5..abad1b47 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -1866,7 +1866,8 @@ struct gaic_request_status { #define GAIC_MAGIC 0x1234abcd -static int pending = 0; +static int gaic_pending = 0; +static int gaic_freed = 0; static void gaic_cancel_request_cb(evutil_socket_t fd, short what, void *arg) @@ -1911,7 +1912,13 @@ gaic_getaddrinfo_cb(int result, struct evutil_addrinfo *res, void *arg) free(status); end: - if (--pending <= 0) + if (res) + { + TT_BLATHER(("evutil_freeaddrinfo(%p)", res)); + evutil_freeaddrinfo(res); + ++gaic_freed; + } + if (--gaic_pending <= 0) event_base_loopexit(base, NULL); } @@ -1929,7 +1936,7 @@ gaic_launch(struct event_base *base, struct evdns_base *dns_base) "foobar.bazquux.example.com", "80", NULL, gaic_getaddrinfo_cb, status); event_add(&status->cancel_event, &tv); - ++pending; + ++gaic_pending; } #ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED @@ -2152,6 +2159,9 @@ test_getaddrinfo_async_cancel_stress(void *ptr) event_base_dispatch(base); + // at least some was canceled via external event + tt_int_op(gaic_freed, !=, 1000); + end: if (dns_base) evdns_base_free(dns_base, 1); |