]> granicus.if.org Git - php/commitdiff
Fixed bug #49517 (cURL's CURLOPT_FILE prevents file from being deleted after fclose).
authorIlia Alshanetsky <iliaa@php.net>
Wed, 30 Sep 2009 02:34:17 +0000 (02:34 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Wed, 30 Sep 2009 02:34:17 +0000 (02:34 +0000)
NEWS
ext/curl/interface.c
ext/curl/php_curl.h

diff --git a/NEWS b/NEWS
index dec1150d5ed25fc4bb78ad48a23e599bb70af817..936ac9033fe836da40df7d218519a013650248f1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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)
index d194aca8a0132658f6c16eb821d5bea70d0b7f91..cacf58e7c378cbede01dc911570bd92f8d123723 100644 (file)
@@ -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);
index f8229e9b6f5f2274f38e1fd3613c02bff02a6522..d50e722a43220ad3b0c1f9ed6a8ddcb626185d97 100644 (file)
@@ -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 {