From: Felipe Pena Date: Fri, 18 Jul 2008 17:34:07 +0000 (+0000) Subject: - Fixed bug #45556 (Return value from callback isn't freed) X-Git-Tag: php-5.2.7RC1~193 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=157856f0d0e566d794b2983db262253e7810e6c9;p=php - Fixed bug #45556 (Return value from callback isn't freed) --- diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index bacbe27f85..95936f6ee0 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -877,15 +877,12 @@ static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRe */ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) { - zval *retval_ptr, **php_function; + zval retval, **php_function; zval* callback_params[1]; char *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; @@ -896,14 +893,14 @@ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) 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) { + 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_ptr); + convert_to_string(&retval); - xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err); + xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL(retval), &err); if(xData) { if(!XMLRPC_ServerAddIntrospectionData(server, xData)) { @@ -919,6 +916,7 @@ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", php_function_name); } } + zval_dtor(&retval); } else { /* user func failed */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", php_function_name);