From: Remi Gacogne Date: Fri, 31 May 2019 08:16:00 +0000 (+0200) Subject: auth: Initialize cURL before starting any thread X-Git-Tag: dnsdist-1.4.0-beta1~11^2 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fpdns.git;a=commitdiff_plain;h=8340b04806191493fb62b8bcd920df5f09f2c726 auth: Initialize cURL before starting any thread If `curl_global_init()` was not called prior to any call to `curl_easy_init()`, it will be automatically called. The documentation states that: > This may be lethal in multi-threaded cases, since > curl_global_init is not thread-safe, and it may result in > resource problems because there is no corresponding cleanup. --- diff --git a/pdns/minicurl.cc b/pdns/minicurl.cc index 915eeecb13..e8ba8e9eda 100644 --- a/pdns/minicurl.cc +++ b/pdns/minicurl.cc @@ -26,12 +26,26 @@ #include #include +void MiniCurl::init() +{ + static std::atomic_flag s_init = ATOMIC_FLAG_INIT; + + if (s_init.test_and_set()) + return; + + CURLcode code = curl_global_init(CURL_GLOBAL_ALL); + if (code != 0) { + throw std::runtime_error("Error initializing libcurl"); + } +} + MiniCurl::MiniCurl(const string& useragent) { d_curl = curl_easy_init(); - if (d_curl != nullptr) { - curl_easy_setopt(d_curl, CURLOPT_USERAGENT, useragent.c_str()); + if (d_curl == nullptr) { + throw std::runtime_error("Error creating a MiniCurl session"); } + curl_easy_setopt(d_curl, CURLOPT_USERAGENT, useragent.c_str()); } MiniCurl::~MiniCurl() @@ -101,6 +115,7 @@ void MiniCurl::setupURL(const std::string& str, const ComboAddress* rem, const C d_data.clear(); } + std::string MiniCurl::getURL(const std::string& str, const ComboAddress* rem, const ComboAddress* src) { setupURL(str, rem, src); diff --git a/pdns/minicurl.hh b/pdns/minicurl.hh index 7e913a897d..80ee3d04fe 100644 --- a/pdns/minicurl.hh +++ b/pdns/minicurl.hh @@ -31,6 +31,8 @@ class MiniCurl { public: + static void init(); + MiniCurl(const string& useragent="MiniCurl/0.0"); ~MiniCurl(); MiniCurl& operator=(const MiniCurl&) = delete; diff --git a/pdns/receiver.cc b/pdns/receiver.cc index 0c86d515be..84e7a21895 100644 --- a/pdns/receiver.cc +++ b/pdns/receiver.cc @@ -72,6 +72,10 @@ #include "dnsrecords.hh" #include "version.hh" +#ifdef HAVE_LUA_RECORDS +#include "minicurl.hh" +#endif /* HAVE_LUA_RECORDS */ + time_t s_starttime; string s_programname="pdns"; // used in packethandler.cc @@ -468,6 +472,10 @@ int main(int argc, char **argv) /* setup rng */ dns_random_init(); +#ifdef HAVE_LUA_RECORDS + MiniCurl::init(); +#endif /* HAVE_LUA_RECORDS */ + if(!::arg()["load-modules"].empty()) { vector modules;