tony2001 Thu Jun 2 17:04:12 2005 EDT
Modified files:
/php-src/ext/curl interface.c php_curl.h
Log:
fix bug #33222 (segfault when CURL handle is closed in a callback).
fix segfaults when CURL callback functions throw exception.
http://cvs.php.net/diff.php/php-src/ext/curl/interface.c?r1=1.56&r2=1.57&ty=u
Index: php-src/ext/curl/interface.c
diff -u php-src/ext/curl/interface.c:1.56 php-src/ext/curl/interface.c:1.57
--- php-src/ext/curl/interface.c:1.56 Thu Apr 21 17:11:21 2005
+++ php-src/ext/curl/interface.c Thu Jun 2 17:04:12 2005
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interface.c,v 1.56 2005/04/21 21:11:21 iliaa Exp $ */
+/* $Id: interface.c,v 1.57 2005/06/02 21:04:12 tony2001 Exp $ */
#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
@@ -490,20 +490,22 @@
fci.no_separation = 0;
fci.symbol_table = NULL;
+ ch->in_callback = 1;
error = zend_call_function(&fci, &t->fci_cache
TSRMLS_CC);
+ ch->in_callback = 0;
if (error == FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Could not call the CURLOPT_WRITEFUNCTION");
length = -1;
- } else {
+ } else if (retval_ptr) {
if (Z_TYPE_P(retval_ptr) != IS_LONG) {
convert_to_long_ex(&retval_ptr);
}
length = Z_LVAL_P(retval_ptr);
+ zval_ptr_dtor(&retval_ptr);
}
zval_ptr_dtor(argv[0]);
zval_ptr_dtor(argv[1]);
- zval_ptr_dtor(&retval_ptr);
break;
}
}
@@ -560,20 +562,23 @@
fci.no_separation = 0;
fci.symbol_table = NULL;
+ ch->in_callback = 1;
error = zend_call_function(&fci, &t->fci_cache
TSRMLS_CC);
+ ch->in_callback = 0;
if (error == FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Cannot call the CURLOPT_READFUNCTION");
- } else {
+ length = -1;
+ } else if (retval_ptr) {
if (Z_TYPE_P(retval_ptr) == IS_STRING) {
length = MIN(size * nmemb,
Z_STRLEN_P(retval_ptr));
memcpy(data, Z_STRVAL_P(retval_ptr),
length);
}
+ zval_ptr_dtor(&retval_ptr);
}
zval_ptr_dtor(argv[0]);
zval_ptr_dtor(argv[1]);
zval_ptr_dtor(argv[2]);
- zval_ptr_dtor(&retval_ptr);
break;
}
}
@@ -631,19 +636,21 @@
fci.params = argv;
fci.no_separation = 0;
+ ch->in_callback = 1;
error = zend_call_function(&fci, &t->fci_cache
TSRMLS_CC);
+ ch->in_callback = 0;
if (error == FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Could not call the CURLOPT_HEADERFUNCTION");
length = -1;
- } else {
+ } else if (retval_ptr) {
if (Z_TYPE_P(retval_ptr) != IS_LONG) {
convert_to_long_ex(&retval_ptr);
}
length = Z_LVAL_P(retval_ptr);
+ zval_ptr_dtor(&retval_ptr);
}
zval_ptr_dtor(argv[0]);
zval_ptr_dtor(argv[1]);
- zval_ptr_dtor(&retval_ptr);
break;
}
@@ -779,6 +786,8 @@
(*ch)->handlers->write_header = ecalloc(1, sizeof(php_curl_write));
(*ch)->handlers->read = ecalloc(1, sizeof(php_curl_read));
+ (*ch)->in_callback = 0;
+
memset(&(*ch)->err, 0, sizeof((*ch)->err));
zend_llist_init(&(*ch)->to_free.str, sizeof(char *),
(void(*)(void *)) curl_free_string, 0);
@@ -1478,6 +1487,12 @@
}
ZEND_FETCH_RESOURCE(ch, php_curl *, zid, -1, le_curl_name, le_curl);
+
+ if (ch->in_callback) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attempt to close
CURL handle from a callback");
+ return;
+ }
+
if (ch->uses) {
ch->uses--;
} else {
http://cvs.php.net/diff.php/php-src/ext/curl/php_curl.h?r1=1.41&r2=1.42&ty=u
Index: php-src/ext/curl/php_curl.h
diff -u php-src/ext/curl/php_curl.h:1.41 php-src/ext/curl/php_curl.h:1.42
--- php-src/ext/curl/php_curl.h:1.41 Fri Mar 12 13:37:55 2004
+++ php-src/ext/curl/php_curl.h Thu Jun 2 17:04:12 2005
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_curl.h,v 1.41 2004/03/12 18:37:55 sterling Exp $ */
+/* $Id: php_curl.h,v 1.42 2005/06/02 21:04:12 tony2001 Exp $ */
#ifndef _PHP_CURL_H
#define _PHP_CURL_H
@@ -121,6 +121,7 @@
php_curl_handlers *handlers;
long id;
unsigned int uses;
+ zend_bool in_callback;
} php_curl;
typedef struct {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php