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