diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2009-09-30 02:34:17 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2009-09-30 02:34:17 +0000 |
commit | 809dbcda08514357b03d05bb7449679d6dbcce4d (patch) | |
tree | b4d77703be883c6d36da5d01e504ed571f23fce2 | |
parent | e56e60c3a009d23a5accc2967e4358d182943108 (diff) | |
download | php-git-809dbcda08514357b03d05bb7449679d6dbcce4d.tar.gz |
Fixed bug #49517 (cURL's CURLOPT_FILE prevents file from being deleted after fclose).
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | ext/curl/interface.c | 31 | ||||
-rw-r--r-- | ext/curl/php_curl.h | 2 |
3 files changed, 32 insertions, 4 deletions
@@ -17,7 +17,8 @@ - Fixed bug #49630 (imap_listscan function missing). (Felipe) - Fixed bug #49531 (CURLOPT_INFILESIZE sometimes causes warning "CURLPROTO_FILE cannot be set"). (Felipe) - +- Fixed bug #49517 (cURL's CURLOPT_FILE prevents file from being deleted after + fclose). (Ilia) ?? ??? 2009, PHP 5.3.1RC? <- WHY IS THIS HERE? Gonna be released after 5.3.1 or what?? - Upgraded bundled sqlite to version 3.6.18. (Ilia) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index d194aca8a0..cacf58e7c3 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1509,10 +1509,22 @@ PHP_FUNCTION(curl_copy_handle) dupch->cp = cp; dupch->uses = 0; + if (ch->handlers->write->stream) { + Z_ADDREF_P(dupch->handlers->write->stream); + dupch->handlers->write->stream = ch->handlers->write->stream; + } dupch->handlers->write->method = ch->handlers->write->method; dupch->handlers->write->type = ch->handlers->write->type; + if (ch->handlers->read->stream) { + Z_ADDREF_P(ch->handlers->read->stream); + } + dupch->handlers->read->stream = ch->handlers->read->stream; dupch->handlers->read->method = ch->handlers->read->method; dupch->handlers->write_header->method = ch->handlers->write_header->method; + if (ch->handlers->write_header->stream) { + Z_ADDREF_P(ch->handlers->write_header->stream); + } + dupch->handlers->write_header->stream = ch->handlers->write_header->stream; dupch->handlers->write->fp = ch->handlers->write->fp; dupch->handlers->write_header->fp = ch->handlers->write_header->fp; @@ -1767,9 +1779,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu switch (option) { case CURLOPT_FILE: if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') { - zend_list_addref(Z_LVAL_PP(zvalue)); + Z_ADDREF_PP(zvalue); ch->handlers->write->fp = fp; ch->handlers->write->method = PHP_CURL_FILE; + ch->handlers->write->stream = *zvalue; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "the provided file handle is not writable"); RETVAL_FALSE; @@ -1778,9 +1791,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu break; case CURLOPT_WRITEHEADER: if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') { - zend_list_addref(Z_LVAL_PP(zvalue)); + Z_ADDREF_PP(zvalue); ch->handlers->write_header->fp = fp; ch->handlers->write_header->method = PHP_CURL_FILE; + ch->handlers->write_header->stream = *zvalue; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "the provided file handle is not writable"); RETVAL_FALSE; @@ -1788,9 +1802,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu } break; case CURLOPT_INFILE: - zend_list_addref(Z_LVAL_PP(zvalue)); + Z_ADDREF_PP(zvalue); ch->handlers->read->fp = fp; ch->handlers->read->fd = Z_LVAL_PP(zvalue); + ch->handlers->read->stream = *zvalue; break; case CURLOPT_STDERR: if (((php_stream *) what)->mode[0] != 'r' || ((php_stream *) what)->mode[1] == '+') { @@ -2477,6 +2492,16 @@ static void _php_curl_close_ex(php_curl *ch TSRMLS_DC) efree(ch->header.str); } + if (ch->handlers->write_header->stream) { + zval_ptr_dtor(&ch->handlers->write_header->stream); + } + if (ch->handlers->write->stream) { + zval_ptr_dtor(&ch->handlers->write->stream); + } + if (ch->handlers->read->stream) { + zval_ptr_dtor(&ch->handlers->read->stream); + } + efree(ch->handlers->write); efree(ch->handlers->write_header); efree(ch->handlers->read); diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index f8229e9b6f..d50e722a43 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -86,6 +86,7 @@ typedef struct { smart_str buf; int method; int type; + zval *stream; } php_curl_write; typedef struct { @@ -94,6 +95,7 @@ typedef struct { FILE *fp; long fd; int method; + zval *stream; } php_curl_read; typedef struct { |