felipe          Fri Jul 18 15:52:38 2008 UTC

  Added files:                 (Branch: PHP_5_2)
    /php-src/ext/xmlrpc/tests   bug45555.phpt 

  Modified files:              
    /php-src/ext/xmlrpc xmlrpc-epi-php.c 
  Log:
  - Fixed bug #45555 (Segfault with invalid non-string as 
register_introspection_callback)
    (patch by chris_se at gmx dot ne)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/xmlrpc-epi-php.c?r1=1.39.2.5.2.9&r2=1.39.2.5.2.10&diff_format=u
Index: php-src/ext/xmlrpc/xmlrpc-epi-php.c
diff -u php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.39.2.5.2.9 
php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.39.2.5.2.10
--- php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.39.2.5.2.9    Fri Jul 18 14:56:58 2008
+++ php-src/ext/xmlrpc/xmlrpc-epi-php.c Fri Jul 18 15:52:38 2008
@@ -51,7 +51,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: xmlrpc-epi-php.c,v 1.39.2.5.2.9 2008/07/18 14:56:58 felipe Exp $ */
+/* $Id: xmlrpc-epi-php.c,v 1.39.2.5.2.10 2008/07/18 15:52:38 felipe Exp $ */
 
 /**********************************************************************
 * BUGS:                                                               *
@@ -879,6 +879,7 @@
 {
        zval *retval_ptr, **php_function;
        zval* callback_params[1];
+       char *php_function_name;
        xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data;
        TSRMLS_FETCH();
 
@@ -893,35 +894,39 @@
        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));
+                       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_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", php_function_name);
+                                               }
+                                               XMLRPC_CleanupValue(xData);
                                        } else {
-                                               php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", 
-                                               Z_STRVAL_PP(php_function));
+                                               /* 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, php_function_name);
+                                               } else {
+                                                       php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", 
php_function_name);
+                                               }
                                        }
+                               } else {
+                                       /* user func failed */
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Error calling user introspection callback: %s()", 
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));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid callback '%s' passed", php_function_name);
                        }
+                       efree(php_function_name);
                } else {
                        break;
                }

http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/tests/bug45555.phpt?view=markup&rev=1.1
Index: php-src/ext/xmlrpc/tests/bug45555.phpt
+++ php-src/ext/xmlrpc/tests/bug45555.phpt



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to