From: Peter van Dijk Date: Tue, 17 Jan 2023 18:10:04 +0000 (+0100) Subject: minicurl: stop leaking hostlist memory X-Git-Tag: auth-4.7.4~9^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F12429%2Fhead;p=thirdparty%2Fpdns.git minicurl: stop leaking hostlist memory --- diff --git a/pdns/minicurl.cc b/pdns/minicurl.cc index d5981c4e41..4ce41cd617 100644 --- a/pdns/minicurl.cc +++ b/pdns/minicurl.cc @@ -51,7 +51,7 @@ MiniCurl::MiniCurl(const string& useragent) MiniCurl::~MiniCurl() { - // NEEDS TO CLEAN HOSTLIST + clearHostlist(); curl_easy_cleanup(d_curl); } @@ -78,7 +78,8 @@ static string extractHostFromURL(const std::string& url) void MiniCurl::setupURL(const std::string& str, const ComboAddress* rem, const ComboAddress* src, int timeout, bool fastopen, bool verify) { if(rem) { - struct curl_slist *hostlist = nullptr; // THIS SHOULD BE FREED + clearHostlist(); + struct curl_slist *hostlist = nullptr; // url = http://hostname.enzo/url string host4=extractHostFromURL(str); @@ -98,7 +99,8 @@ void MiniCurl::setupURL(const std::string& str, const ComboAddress* rem, const C hostlist = curl_slist_append(hostlist, hcode.c_str()); } - curl_easy_setopt(d_curl, CURLOPT_RESOLVE, hostlist); + d_host_list = hostlist; + curl_easy_setopt(d_curl, CURLOPT_RESOLVE, d_host_list); } if(src) { curl_easy_setopt(d_curl, CURLOPT_INTERFACE, src->toString().c_str()); @@ -169,6 +171,15 @@ void MiniCurl::clearHeaders() } } +void MiniCurl::clearHostlist() +{ + if (d_curl && d_host_list) { + curl_easy_setopt(d_curl, CURLOPT_RESOLVE, NULL); + curl_slist_free_all(d_host_list); + d_host_list = nullptr; + } +} + void MiniCurl::setHeaders(const MiniCurlHeaders& headers) { if (d_curl) { diff --git a/pdns/minicurl.hh b/pdns/minicurl.hh index b59656ae71..5c4754f94d 100644 --- a/pdns/minicurl.hh +++ b/pdns/minicurl.hh @@ -45,7 +45,9 @@ private: static size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata); std::string d_data; struct curl_slist* d_header_list = nullptr; + struct curl_slist* d_host_list = nullptr; void setupURL(const std::string& str, const ComboAddress* rem, const ComboAddress* src, int timeout, bool fastopen, bool verify); void setHeaders(const MiniCurlHeaders& headers); void clearHeaders(); + void clearHostlist(); };