felipe Sun Jul 20 15:52:07 2008 UTC Modified files: /php-src/ext/xmlrpc xmlrpc-epi-php.c /php-src/ext/xmlrpc/tests bug45555.phpt bug45556.phpt Log: MFB: - Fixed bug #45556 (Return value from callback isn't freed). - Fixed bug #45555 (Segfault with invalid non-string as register_introspection_callback). - Fixed wrong arginfo for xmlrpc_encode_request() http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/xmlrpc-epi-php.c?r1=1.57&r2=1.58&diff_format=u Index: php-src/ext/xmlrpc/xmlrpc-epi-php.c diff -u php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.57 php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.58 --- php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.57 Mon Jun 30 13:47:22 2008 +++ php-src/ext/xmlrpc/xmlrpc-epi-php.c Sun Jul 20 15:52:06 2008 @@ -51,7 +51,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xmlrpc-epi-php.c,v 1.57 2008/06/30 13:47:22 felipe Exp $ */ +/* $Id: xmlrpc-epi-php.c,v 1.58 2008/07/20 15:52:06 felipe Exp $ */ /********************************************************************** * BUGS: * @@ -97,7 +97,7 @@ static ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_encode_request, 0, 0, 2) ZEND_ARG_INFO(0, method) - ZEND_ARG_INFO(1, params) + ZEND_ARG_INFO(0, params) ZEND_ARG_INFO(0, output_options) ZEND_END_ARG_INFO() @@ -951,58 +951,54 @@ */ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) /* {{{ */ { - zval *retval_ptr, **php_function; + zval retval, **php_function; zval* callback_params[1]; + zval php_function_name; xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; TSRMLS_FETCH(); - MAKE_STD_ZVAL(retval_ptr); - Z_TYPE_P(retval_ptr) = IS_NULL; - /* setup data hoojum */ callback_params[0] = pData->caller_params; /* loop through and call all registered callbacks */ zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map)); while(1) { - if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map), - (void**)&php_function) == SUCCESS) { - - /* php func prototype: function string user_func($user_params) */ - if(call_user_function(CG(function_table), NULL, *php_function, - retval_ptr, 1, callback_params TSRMLS_CC) == SUCCESS) { - XMLRPC_VALUE xData; - STRUCT_XMLRPC_ERROR err = {0}; - - /* return value should be a string */ - convert_to_string(retval_ptr); - - xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err); - - if(xData) { - if(!XMLRPC_ServerAddIntrospectionData(server, xData)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(), improper element structure", Z_STRVAL_PP(php_function)); - } - XMLRPC_CleanupValue(xData); - } - else { - /* could not create description */ - if(err.xml_elem_error.parser_code) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %s()", - err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, Z_STRVAL_PP(php_function)); - } - else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", - Z_STRVAL_PP(php_function)); + if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map), (void**)&php_function) == SUCCESS) { + if (zend_is_callable(*php_function, 0, &php_function_name)) { + /* php func prototype: function string user_func($user_params) */ + if (call_user_function(CG(function_table), NULL, *php_function, &retval, 1, callback_params TSRMLS_CC) == SUCCESS) { + XMLRPC_VALUE xData; + STRUCT_XMLRPC_ERROR err = {0}; + + /* return value should be a string */ + convert_to_string(&retval); + + xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL(retval), &err); + + if(xData) { + if(!XMLRPC_ServerAddIntrospectionData(server, xData)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %v(), improper element structure", Z_UNIVAL(php_function_name)); + } + XMLRPC_CleanupValue(xData); + } else { + /* could not create description */ + if(err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %v()", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, Z_UNIVAL(php_function_name)); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %v()", Z_UNIVAL(php_function_name)); + } } + zval_dtor(&retval); + } else { + /* user func failed */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %v()", Z_UNIVAL(php_function_name)); } + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid callback '%v' passed", Z_UNIVAL(php_function_name)); } - else { - /* user func failed */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", Z_STRVAL_PP(php_function)); - } - } - else { + zval_dtor(&php_function_name); + } else { break; } http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/tests/bug45555.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/xmlrpc/tests/bug45555.phpt diff -u /dev/null php-src/ext/xmlrpc/tests/bug45555.phpt:1.2 --- /dev/null Sun Jul 20 15:52:07 2008 +++ php-src/ext/xmlrpc/tests/bug45555.phpt Sun Jul 20 15:52:07 2008 @@ -0,0 +1,20 @@ +--TEST-- +Bug #45555 (Segfault with invalid non-string as register_introspection_callback) +--FILE-- +<?php + +$options = array (); +$request = xmlrpc_encode_request ("system.describeMethods", $options); +$server = xmlrpc_server_create (); + +xmlrpc_server_register_introspection_callback($server, 1); +xmlrpc_server_register_introspection_callback($server, array('foo', 'bar')); + +$options = array ('output_type' => 'xml', 'version' => 'xmlrpc'); +xmlrpc_server_call_method ($server, $request, NULL, $options); + +?> +--EXPECTF-- +Warning: xmlrpc_server_call_method(): Invalid callback '1' passed in %s on line %d + +Warning: xmlrpc_server_call_method(): Invalid callback 'foo::bar' passed in %s on line %d http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/tests/bug45556.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/xmlrpc/tests/bug45556.phpt diff -u /dev/null php-src/ext/xmlrpc/tests/bug45556.phpt:1.2 --- /dev/null Sun Jul 20 15:52:07 2008 +++ php-src/ext/xmlrpc/tests/bug45556.phpt Sun Jul 20 15:52:07 2008 @@ -0,0 +1,41 @@ +--TEST-- +Bug #45556 (Return value from callback isn't freed) +--FILE-- +<?php + +$options = array (); +$request = xmlrpc_encode_request ("system.describeMethods", $options); +$server = xmlrpc_server_create (); + + +function foo() { return 11111; } + +class bar { + static public function test() { + return 'foo'; + } +} + +xmlrpc_server_register_introspection_callback($server, 'foobar'); +xmlrpc_server_register_introspection_callback($server, array('bar', 'test')); +xmlrpc_server_register_introspection_callback($server, array('foo', 'bar')); + +$options = array ('output_type' => 'xml', 'version' => 'xmlrpc'); +xmlrpc_server_call_method ($server, $request, NULL, $options); + +?> +--EXPECTF-- + +Warning: xmlrpc_server_call_method(): Invalid callback 'foobar' passed in %s on line %d +expat reports error code 5 + description: Invalid document end + line: 1 + column: 1 + byte index: 0 + total bytes: 0 + + data beginning 0 before byte index: foo + +Warning: xmlrpc_server_call_method(): xml parse error: [line 1, column 1, message: Invalid document end] Unable to add introspection data returned from bar::test() in %s on line %d + +Warning: xmlrpc_server_call_method(): Invalid callback 'foo::bar' passed in %s on line %d
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php