iliaa Fri Mar 12 12:31:10 2004 EDT Modified files: /php-src/ext/curl interface.c Log: Additional checks of return values from user callback functions. http://cvs.php.net/diff.php/php-src/ext/curl/interface.c?r1=1.38&r2=1.39&ty=u Index: php-src/ext/curl/interface.c diff -u php-src/ext/curl/interface.c:1.38 php-src/ext/curl/interface.c:1.39 --- php-src/ext/curl/interface.c:1.38 Fri Mar 12 11:36:30 2004 +++ php-src/ext/curl/interface.c Fri Mar 12 12:31:10 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interface.c,v 1.38 2004/03/12 16:36:30 sterling Exp $ */ +/* $Id: interface.c,v 1.39 2004/03/12 17:31:10 iliaa Exp $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS @@ -433,6 +433,9 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the CURLOPT_WRITEFUNCTION"); length = -1; } else { + if (Z_TYPE_P(retval_ptr) != IS_LONG) { + convert_to_long_ex(&retval_ptr); + } length = Z_LVAL_P(retval_ptr); } @@ -500,8 +503,8 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot call the CURLOPT_READFUNCTION"); } else { if (Z_TYPE_P(retval_ptr) == IS_STRING) { - memcpy(data, Z_STRVAL_P(retval_ptr), size * nmemb); - length = Z_STRLEN_P(retval_ptr); + length = MIN(size * nmemb, Z_STRLEN_P(retval_ptr)); + memcpy(data, Z_STRVAL_P(retval_ptr), length); } } @@ -571,6 +574,9 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the CURLOPT_HEADERFUNCTION"); length = -1; } else { + if (Z_TYPE_P(retval_ptr) != IS_LONG) { + convert_to_long_ex(&retval_ptr); + } length = Z_LVAL_P(retval_ptr); } zval_ptr_dtor(argv[0]); @@ -578,8 +584,12 @@ zval_ptr_dtor(&retval_ptr); break; } + case PHP_CURL_IGNORE: return length; + + default: + return -1; } return length; @@ -595,7 +605,7 @@ zval *argv[3]; zval *retval = NULL; int error; - int ret = 0; + int ret = -1; TSRMLS_FETCH_FROM_CTX(ch->thread_ctx); MAKE_STD_ZVAL(argv[0]); @@ -610,13 +620,15 @@ error = call_user_function(EG(function_table), NULL, func, retval, 2, argv TSRMLS_CC); if (error == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the CURLOPT_PASSWDFUNCTION"); - ret = -1; } else { - if (Z_STRLEN_P(retval) > buflen) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Returned password is too long for libcurl to handle"); - ret = -1; + if (Z_TYPE_P(retval) != IS_STRING) { + if (Z_STRLEN_P(retval) > buflen) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Returned password is too long for libcurl to handle"); + } else { + strlcpy(buf, Z_STRVAL_P(retval), Z_STRLEN_P(retval)); + } } else { - strlcpy(buf, Z_STRVAL_P(retval), buflen); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "User handler '%s' did not return a string.", Z_STRVAL_P(func)); } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php