From: Tolga Ceylan Date: Sun, 20 Mar 2016 02:03:31 +0000 (-0700) Subject: write_http: in cleanup handler free http headers X-Git-Tag: collectd-5.5.2~6^2~17^2 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=daa5c7a886b4406d5b8bfdbecd6f998f9ca07fea;p=collectd.git write_http: in cleanup handler free http headers slist of http headers require cleanup to avoid memory leak. See libcurl example: https://curl.haxx.se/libcurl/c/httpcustomheader.html --- diff --git a/src/write_http.c b/src/write_http.c index bfb5524c..bbd94af1 100644 --- a/src/write_http.c +++ b/src/write_http.c @@ -56,6 +56,7 @@ struct wh_callback_s int format; CURL *curl; + struct curl_slist *headers; char curl_errbuf[CURL_ERROR_SIZE]; char send_buffer[4096]; @@ -99,8 +100,6 @@ static int wh_send_buffer (wh_callback_t *cb) /* {{{ */ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ { - struct curl_slist *headers; - if (cb->curl != NULL) return (0); @@ -114,14 +113,14 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION); - headers = NULL; - headers = curl_slist_append (headers, "Accept: */*"); + cb->headers = NULL; + cb->headers = curl_slist_append (cb->headers, "Accept: */*"); if (cb->format == WH_FORMAT_JSON) - headers = curl_slist_append (headers, "Content-Type: application/json"); + cb->headers = curl_slist_append (cb->headers, "Content-Type: application/json"); else - headers = curl_slist_append (headers, "Content-Type: text/plain"); - headers = curl_slist_append (headers, "Expect:"); - curl_easy_setopt (cb->curl, CURLOPT_HTTPHEADER, headers); + cb->headers = curl_slist_append (cb->headers, "Content-Type: text/plain"); + cb->headers = curl_slist_append (cb->headers, "Expect:"); + curl_easy_setopt (cb->curl, CURLOPT_HTTPHEADER, cb->headers); curl_easy_setopt (cb->curl, CURLOPT_ERRORBUFFER, cb->curl_errbuf); curl_easy_setopt (cb->curl, CURLOPT_URL, cb->location); @@ -264,6 +263,13 @@ static void wh_callback_free (void *data) /* {{{ */ wh_flush_nolock (/* timeout = */ 0, cb); curl_easy_cleanup (cb->curl); + + if (cb->headers != NULL) + { + curl_slist_free_all (cb->headers); + cb->headers = NULL; + } + sfree (cb->location); sfree (cb->user); sfree (cb->pass); @@ -525,6 +531,7 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */ cb->cacert = NULL; cb->format = WH_FORMAT_COMMAND; cb->curl = NULL; + cb->headers = NULL; pthread_mutex_init (&cb->send_lock, /* attr = */ NULL);