From b36afe2957d77c9eb682097302c7f133620e7f4d Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 22 Nov 2000 15:46:13 +0000 Subject: [PATCH] Fix memory leaks in cURL. cURL doesn't free strings we pass to him, so let PHP do it. --- ext/curl/curl.c | 8 ++++++++ ext/curl/php_curl.h | 1 + 2 files changed, 9 insertions(+) diff --git a/ext/curl/curl.c b/ext/curl/curl.c index 292f2e9dd2..8945272b12 100644 --- a/ext/curl/curl.c +++ b/ext/curl/curl.c @@ -267,6 +267,9 @@ PHP_MSHUTDOWN_FUNCTION(curl) return SUCCESS; } +static void curl_free_string(void **string) { + efree(*string); +} /* {{{ proto string curl_version(void) Return the CURL version string. */ @@ -296,6 +299,8 @@ PHP_FUNCTION(curl_init) } memset(curl_handle, 0, sizeof(php_curl)); + zend_llist_init(&curl_handle->to_free,sizeof(char *),curl_free_string,0); + curl_handle->cp = curl_easy_init(); if (!curl_handle->cp) { php_error(E_ERROR, "Cannot initialize CURL Handle"); @@ -308,6 +313,7 @@ PHP_FUNCTION(curl_init) urlstr = estrndup(Z_STRVAL_PP(url), Z_STRLEN_PP(url)); curl_easy_setopt(curl_handle->cp, CURLOPT_URL, urlstr); + zend_llist_add_element(&curl_handle->to_free,&urlstr); } curl_easy_setopt(curl_handle->cp, CURLOPT_NOPROGRESS, 1); @@ -375,6 +381,7 @@ PHP_FUNCTION(curl_setopt) copystr = estrndup(Z_STRVAL_PP(curl_value), Z_STRLEN_PP(curl_value)); ret = curl_easy_setopt(curl_handle->cp, option, copystr); + zend_llist_add_element(&curl_handle->to_free,©str); } break; @@ -793,6 +800,7 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc) { php_curl *curl_handle = (php_curl *)rsrc->ptr; curl_easy_cleanup(curl_handle->cp); + zend_llist_clean(&curl_handle->to_free); efree(curl_handle); } /* }}} */ diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index dd8aabe549..4d0219b434 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -56,6 +56,7 @@ typedef struct { int cerrno; char error[CURL_ERROR_SIZE+1]; CURL *cp; + zend_llist to_free; } php_curl; typedef struct { -- 2.50.1