]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
minicurl: stop leaking hostlist memory 12429/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Tue, 17 Jan 2023 18:10:04 +0000 (19:10 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Tue, 17 Jan 2023 18:10:04 +0000 (19:10 +0100)
pdns/minicurl.cc
pdns/minicurl.hh

index d5981c4e417d9bf325dfda05b402bb56806d241a..4ce41cd6178306a8288233b988388c46c0bdd777 100644 (file)
@@ -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) {
index b59656ae71d8d2f8307488850bc46238c66ec245..5c4754f94d71e12d063353f7161a192655d51ac5 100644 (file)
@@ -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();
 };