iliaa                                    Wed, 30 Sep 2009 02:34:17 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=288973

Log:
Fixed bug #49517 (cURL's CURLOPT_FILE prevents file from being deleted after 
fclose).

Bug: http://bugs.php.net/49517 (Verified) cURL's CURLOPT_FILE prevents file 
from being deleted after fclose
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/NEWS
    U   php/php-src/branches/PHP_5_2/ext/curl/interface.c
    U   php/php-src/branches/PHP_5_2/ext/curl/php_curl.h
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/curl/interface.c
    U   php/php-src/branches/PHP_5_3/ext/curl/php_curl.h
    U   php/php-src/trunk/ext/curl/interface.c
    U   php/php-src/trunk/ext/curl/php_curl.h

Modified: php/php-src/branches/PHP_5_2/NEWS
===================================================================
--- php/php-src/branches/PHP_5_2/NEWS	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_2/NEWS	2009-09-30 02:34:17 UTC (rev 288973)
@@ -13,6 +13,8 @@
   mbstring.strict_mode is turned on). (Moriyoshi)
 - 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)
 - Fixed bug #49354 (mb_strcut() cuts wrong length when offset is in the middle
   of a multibyte character). (Moriyoshi)
 - Fixed bug #49528 (UTF-16 strings prefixed by BOMs wrondly converted).

Modified: php/php-src/branches/PHP_5_2/ext/curl/interface.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/curl/interface.c	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_2/ext/curl/interface.c	2009-09-30 02:34:17 UTC (rev 288973)
@@ -1228,10 +1228,22 @@

 	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;
@@ -1457,9 +1469,10 @@
 			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;
@@ -1468,9 +1481,10 @@
 					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;
@@ -1478,9 +1492,10 @@
 					}
 					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] == '+') {
@@ -2129,6 +2144,16 @@
 		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);

Modified: php/php-src/branches/PHP_5_2/ext/curl/php_curl.h
===================================================================
--- php/php-src/branches/PHP_5_2/ext/curl/php_curl.h	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_2/ext/curl/php_curl.h	2009-09-30 02:34:17 UTC (rev 288973)
@@ -86,6 +86,7 @@
 	smart_str       buf;
 	int             method;
 	int             type;
+	zval		*stream;
 } php_curl_write;

 typedef struct {
@@ -94,6 +95,7 @@
 	FILE            *fp;
 	long            fd;
 	int             method;
+	zval		*stream;
 } php_curl_read;

 typedef struct {

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_3/NEWS	2009-09-30 02:34:17 UTC (rev 288973)
@@ -17,8 +17,9 @@
 - 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)
 - Restored shebang line check to CGI sapi (not checked by scanner anymore).

Modified: php/php-src/branches/PHP_5_3/ext/curl/interface.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/curl/interface.c	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_3/ext/curl/interface.c	2009-09-30 02:34:17 UTC (rev 288973)
@@ -1509,10 +1509,22 @@

 	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 @@
 			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 @@
 					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 @@
 					}
 					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 @@
 		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);

Modified: php/php-src/branches/PHP_5_3/ext/curl/php_curl.h
===================================================================
--- php/php-src/branches/PHP_5_3/ext/curl/php_curl.h	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/branches/PHP_5_3/ext/curl/php_curl.h	2009-09-30 02:34:17 UTC (rev 288973)
@@ -86,6 +86,7 @@
 	smart_str       buf;
 	int             method;
 	int             type;
+	zval		*stream;
 } php_curl_write;

 typedef struct {
@@ -94,6 +95,7 @@
 	FILE            *fp;
 	long            fd;
 	int             method;
+	zval		*stream;
 } php_curl_read;

 typedef struct {

Modified: php/php-src/trunk/ext/curl/interface.c
===================================================================
--- php/php-src/trunk/ext/curl/interface.c	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/trunk/ext/curl/interface.c	2009-09-30 02:34:17 UTC (rev 288973)
@@ -1527,10 +1527,22 @@

 	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;
@@ -1785,9 +1797,10 @@
 			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;
@@ -1796,9 +1809,10 @@
 					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;
@@ -1806,9 +1820,10 @@
 					}
 					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] == '+') {
@@ -2545,6 +2560,16 @@
 		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);

Modified: php/php-src/trunk/ext/curl/php_curl.h
===================================================================
--- php/php-src/trunk/ext/curl/php_curl.h	2009-09-29 23:50:57 UTC (rev 288972)
+++ php/php-src/trunk/ext/curl/php_curl.h	2009-09-30 02:34:17 UTC (rev 288973)
@@ -86,6 +86,7 @@
 	smart_str       buf;
 	int             method;
 	int             type;
+	zval		*stream;
 } php_curl_write;

 typedef struct {
@@ -94,6 +95,7 @@
 	FILE            *fp;
 	long            fd;
 	int             method;
+	zval		*stream;
 } php_curl_read;

 typedef struct {
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to