From a03f0f8a54bd87431daec6eada059a14a01a2cf9 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Sun, 5 Jul 2020 11:59:32 +0300 Subject: [PATCH] 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. (cherry picked from commit 90bcf2d660b9b43cb8e747421d4938f08f935bd7) --- test/regress_dns.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/test/regress_dns.c b/test/regress_dns.c index 2d204bf5..9a8bff4f 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -1808,7 +1808,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) @@ -1853,7 +1854,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); } @@ -1871,7 +1878,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 @@ -2094,6 +2101,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);