summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorPierrick Charron <pierrick@php.net>2011-11-21 02:29:24 +0000
committerPierrick Charron <pierrick@php.net>2011-11-21 02:29:24 +0000
commitd69a1b09af8a84ce493b88528f3cac78252e1326 (patch)
treedbb7f9114d57af91470768ec88d12852e592b121 /ext
parente3557389bf965bd3237d20797eb0b07be7803db5 (diff)
downloadphp-git-d69a1b09af8a84ce493b88528f3cac78252e1326.tar.gz
Fix memory leak
Diffstat (limited to 'ext')
-rw-r--r--ext/curl/interface.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 26b7ee0a7a..f0ec4a53cb 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1420,6 +1420,9 @@ static void alloc_curl_handle(php_curl **ch)
(*ch)->header.str_len = 0;
memset(&(*ch)->err, 0, sizeof((*ch)->err));
+ (*ch)->handlers->write->stream = NULL;
+ (*ch)->handlers->write_header->stream = NULL;
+ (*ch)->handlers->read->stream = NULL;
zend_llist_init(&(*ch)->to_free.str, sizeof(char *), (llist_dtor_func_t) curl_free_string, 0);
zend_llist_init(&(*ch)->to_free.slist, sizeof(struct curl_slist), (llist_dtor_func_t) curl_free_slist, 0);
@@ -1886,6 +1889,9 @@ string_copy:
switch (option) {
case CURLOPT_FILE:
if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') {
+ if (ch->handlers->write->stream) {
+ Z_DELREF_P(ch->handlers->write->stream);
+ }
Z_ADDREF_PP(zvalue);
ch->handlers->write->fp = fp;
ch->handlers->write->method = PHP_CURL_FILE;
@@ -1898,6 +1904,9 @@ string_copy:
break;
case CURLOPT_WRITEHEADER:
if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') {
+ if (ch->handlers->write_header->stream) {
+ Z_DELREF_P(ch->handlers->write_header->stream);
+ }
Z_ADDREF_PP(zvalue);
ch->handlers->write_header->fp = fp;
ch->handlers->write_header->method = PHP_CURL_FILE;
@@ -1909,6 +1918,9 @@ string_copy:
}
break;
case CURLOPT_INFILE:
+ if (ch->handlers->read->stream) {
+ Z_DELREF_P(ch->handlers->read->stream);
+ }
Z_ADDREF_PP(zvalue);
ch->handlers->read->fp = fp;
ch->handlers->read->fd = Z_LVAL_PP(zvalue);