fix: crash when evdns_base_new() fails (#2627)

Fixes #1437 by checking for nullptr before calling evdns_base_free().
This commit is contained in:
Charles Kerr 2022-02-14 15:42:30 -06:00 committed by GitHub
parent f87d737e0f
commit 0adc6b95de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 4 deletions

View File

@ -24,7 +24,6 @@
#include <sys/stat.h> /* umask() */
#endif
#include <event2/dns.h> /* evdns_base_free() */
#include <event2/event.h>
#include <libutp/utp.h>
@ -1837,8 +1836,6 @@ static void sessionCloseImplFinish(tr_session* session)
session->saveTimer = nullptr;
/* we had to wait until UDP trackers were closed before closing these: */
evdns_base_free(session->evdns_base, 0);
session->evdns_base = nullptr;
tr_tracker_udp_close(session);
tr_udpUninit(session);

View File

@ -201,18 +201,23 @@ static void libeventThreadFunc(tr_event_handle* events)
// create the libevent base
auto* const base = event_base_new();
auto* const dns_base = evdns_base_new(base, EVDNS_BASE_INITIALIZE_NAMESERVERS);
// initialize the session struct's event fields
events->base = base;
events->work_queue_event = event_new(base, -1, 0, onWorkAvailable, events->session);
events->session->event_base = base;
events->session->evdns_base = evdns_base_new(base, EVDNS_BASE_INITIALIZE_NAMESERVERS);
events->session->evdns_base = dns_base;
events->session->events = events;
// loop until `tr_eventClose()` kills the loop
event_base_loop(base, EVLOOP_NO_EXIT_ON_EMPTY);
// shut down the thread
if (dns_base != nullptr)
{
evdns_base_free(dns_base, 0);
}
event_base_free(base);
events->session->event_base = nullptr;
events->session->evdns_base = nullptr;