From: Nick Mathewson Date: Thu, 18 Sep 2014 16:40:38 +0000 (-0400) Subject: Fix several memory leaks in the unit tests. X-Git-Tag: release-2.1.5-beta~26 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89c1a3b7fe91a5132f854be9f672b0daa368cf7d;p=libevent Fix several memory leaks in the unit tests. Also add a comment to buffer.c about why we call evbuffer_file_segment_free on failure to add the segment. --- diff --git a/buffer.c b/buffer.c index d76e649e..f5a52104 100644 --- a/buffer.c +++ b/buffer.c @@ -3203,7 +3203,7 @@ evbuffer_add_file_segment(struct evbuffer *buf, return 0; err: EVBUFFER_UNLOCK(buf); - evbuffer_file_segment_free(seg); + evbuffer_file_segment_free(seg); /* Lowers the refcount */ return -1; } diff --git a/test/regress.c b/test/regress.c index 0438a9d3..399ba2fb 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1673,7 +1673,7 @@ static void test_active_later(void *ptr) { struct basic_test_data *data = ptr; - struct event *ev1, *ev2; + struct event *ev1 = NULL, *ev2 = NULL; struct event ev3, ev4; struct timeval qsec = {0, 100000}; ev1 = event_new(data->base, data->pair[0], EV_READ|EV_PERSIST, read_and_drain_cb, NULL); @@ -1708,10 +1708,15 @@ test_active_later(void *ptr) * it. */ event_active_later_(&ev3, EV_READ); event_base_assert_ok_(data->base); + +end: + if (ev1) + event_free(ev1); + if (ev2) + event_free(ev2); + event_base_free(data->base); data->base = NULL; -end: - ; } diff --git a/test/regress_buffer.c b/test/regress_buffer.c index c1f337bf..aa1cd2a7 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -819,7 +819,6 @@ test_evbuffer_add_file(void *ptr) if (use_segment) { tt_assert(evbuffer_add_file_segment(src, seg, segment_offset, segment_len)!=-1); - seg = NULL; /* Avoid double-free */ } else { tt_assert(evbuffer_add_file(src, fd, starting_offset, mapping_len) != -1); @@ -864,6 +863,10 @@ test_evbuffer_add_file(void *ptr) evutil_closesocket(pair[0]); if (pair[1] >= 0) evutil_closesocket(pair[1]); + if (wev) + event_free(wev); + if (rev) + event_free(rev); if (tmpfilename) { unlink(tmpfilename); free(tmpfilename); diff --git a/test/regress_dns.c b/test/regress_dns.c index 91db1531..bf7e76e5 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -870,8 +870,12 @@ dns_inflight_test_impl(void *arg, int flags) end: if (dns) evdns_base_free(dns, 0); - if (exit_port) + if (exit_port) { evdns_close_server_port(exit_port); + exit_port = NULL; + } else if (! disable_when_inactive) { + evdns_close_server_port(dns_port); + } } static void @@ -1861,6 +1865,7 @@ dbg_leak_resume(void *env_, int cancel, int send_err_shutdown) end: evdns_base_free(env->dns_base, send_err_shutdown); env->dns_base = 0; + event_base_free(env->base); env->base = 0; } diff --git a/test/regress_http.c b/test/regress_http.c index 7c8337a3..d62dfbbf 100644 --- a/test/regress_http.c +++ b/test/regress_http.c @@ -399,7 +399,7 @@ http_basic_test(void *arg) { struct basic_test_data *data = arg; struct timeval tv; - struct bufferevent *bev; + struct bufferevent *bev = NULL; evutil_socket_t fd; const char *http_request; ev_uint16_t port = 0, port2 = 0; @@ -484,7 +484,8 @@ http_basic_test(void *arg) evhttp_free(http); end: - ; + if (bev) + bufferevent_free(bev); } diff --git a/test/regress_ssl.c b/test/regress_ssl.c index c2113414..bf9b46b1 100644 --- a/test/regress_ssl.c +++ b/test/regress_ssl.c @@ -194,6 +194,7 @@ respond_to_number(struct bufferevent *bev, void *ctx) n = atoi(line); if (n <= 0) TT_FAIL(("Bad number: %s", line)); + free(line); TT_BLATHER(("The number was %d", n)); if (n == 1001) { ++test_is_done; diff --git a/test/regress_thread.c b/test/regress_thread.c index 612bf1d6..131d6def 100644 --- a/test/regress_thread.c +++ b/test/regress_thread.c @@ -382,7 +382,8 @@ thread_conditions_simple(void *arg) tt_int_op(n_signal, ==, 1); end: - ; + EVTHREAD_FREE_LOCK(cond.lock, EVTHREAD_LOCKTYPE_RECURSIVE); + EVTHREAD_FREE_COND(cond.cond); } #define CB_COUNT 128