tony2001 Thu Jun 2 17:05:07 2005 EDT Modified files: (Branch: PHP_4_3) /php-src NEWS /php-src/ext/curl curl.c php_curl.h Log: MFH: fix bug #33222 (segfault when CURL handle is closed in a callback). http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1247.2.918&r2=1.1247.2.919&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1247.2.918 php-src/NEWS:1.1247.2.919 --- php-src/NEWS:1.1247.2.918 Thu Jun 2 11:42:58 2005 +++ php-src/NEWS Thu Jun 2 17:05:06 2005 @@ -8,6 +8,7 @@ - Changed sha1_file() and md5_file() functions to use streams instead of low level IO. (Uwe) - Fixed memory corruption in stristr(). (Derick) +- Fixed bug #33222 (segfault when CURL handle is closed in a callback). (Tony) - Fixed bug #33214 (odbc_next_result does not signal SQL errors with 2-statement SQL batches). (rich at kastle dot com, Tony) - Fixed bug #33210 (relax jpeg recursive loop protection). (Ilia) http://cvs.php.net/diff.php/php-src/ext/curl/curl.c?r1=1.124.2.29&r2=1.124.2.30&ty=u Index: php-src/ext/curl/curl.c diff -u php-src/ext/curl/curl.c:1.124.2.29 php-src/ext/curl/curl.c:1.124.2.30 --- php-src/ext/curl/curl.c:1.124.2.29 Mon Mar 14 04:03:09 2005 +++ php-src/ext/curl/curl.c Thu Jun 2 17:05:06 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: curl.c,v 1.124.2.29 2005/03/14 09:03:09 sniper Exp $ */ +/* $Id: curl.c,v 1.124.2.30 2005/06/02 21:05:06 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -436,10 +436,12 @@ zend_list_addref(ch->id); ZVAL_STRINGL(argv[1], data, length, 1); + ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 2, argv TSRMLS_CC); + ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Couldn't call the CURLOPT_WRITEFUNCTION", get_active_function_name(TSRMLS_C)); @@ -495,10 +497,12 @@ zend_list_addref(t->fd); ZVAL_LONG(argv[2], (int) size * nmemb); + ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 3, argv TSRMLS_CC); + ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Cannot call the CURLOPT_READFUNCTION", get_active_function_name(TSRMLS_C)); @@ -553,10 +557,12 @@ zend_list_addref(ch->id); ZVAL_STRINGL(argv[1], data, length, 1); + ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 2, argv TSRMLS_CC); + ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Couldn't call the CURLOPT_HEADERFUNCTION", get_active_function_name(TSRMLS_C)); @@ -606,10 +612,12 @@ ZVAL_STRING(argv[1], prompt, 1); ZVAL_LONG(argv[2], buflen); + ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, func, retval, 2, argv TSRMLS_CC); + ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Couldn't call the CURLOPT_PASSWDFUNCTION", get_active_function_name(TSRMLS_C)); } else if (Z_TYPE_P(retval) == IS_STRING) { @@ -680,7 +688,9 @@ (*ch)->handlers->write_header = ecalloc(1, sizeof(php_curl_write)); (*ch)->handlers->read = ecalloc(1, sizeof(php_curl_read)); memset(&(*ch)->err, 0, sizeof((*ch)->err)); - + + (*ch)->in_callback = 0; + zend_llist_init(&(*ch)->to_free.str, sizeof(char *), (void(*)(void *)) curl_free_string, 0); zend_llist_init(&(*ch)->to_free.slist, sizeof(struct curl_slist), @@ -1337,7 +1347,11 @@ WRONG_PARAM_COUNT; } 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; + } zend_list_delete(Z_LVAL_PP(zid)); } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/curl/php_curl.h?r1=1.29.2.1&r2=1.29.2.2&ty=u Index: php-src/ext/curl/php_curl.h diff -u php-src/ext/curl/php_curl.h:1.29.2.1 php-src/ext/curl/php_curl.h:1.29.2.2 --- php-src/ext/curl/php_curl.h:1.29.2.1 Tue Dec 31 11:34:15 2002 +++ php-src/ext/curl/php_curl.h Thu Jun 2 17:05:06 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_curl.h,v 1.29.2.1 2002/12/31 16:34:15 sebastian Exp $ */ +/* $Id: php_curl.h,v 1.29.2.2 2005/06/02 21:05:06 tony2001 Exp $ */ #ifndef _PHP_CURL_H #define _PHP_CURL_H @@ -93,6 +93,7 @@ struct _php_curl_free to_free; long id; unsigned int uses; + zend_bool in_callback; } php_curl; /* streams support */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php