]> granicus.if.org Git - libevent/commitdiff
test: fix leak in dns/getaddrinfo_cancel_stress
authorAzat Khuzhin <azat@libevent.org>
Sun, 5 Jul 2020 08:59:32 +0000 (11:59 +0300)
committerAzat Khuzhin <azat@libevent.org>
Sun, 5 Jul 2020 09:16:52 +0000 (12:16 +0300)
Some requests may get response (evutil_addrinfo) from gaic_server_cb,
in case of cancel_event (10000ms) will not be fast enough.

test/regress_dns.c

index c19604a5bf5f6ece7e91332efa38861a36ec9c17..abad1b474b51c4834f1b51e4015e034f4ed1d4c9 100644 (file)
@@ -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);