From 050eed2245b059c511ce9eb6bb1b14d2061caa24 Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Tue, 17 Jan 2023 19:10:04 +0100 Subject: [PATCH] minicurl: stop leaking hostlist memory --- pdns/minicurl.cc | 17 ++++++++++++++--- pdns/minicurl.hh | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) 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(); }; -- 2.47.2