ID: 27446
Comment by: kawai at apache dot org
Reported By: tomy at envox dot hr
Status: Verified
Bug Type: XMLRPC-EPI related
Operating System: *
PHP Version: 5CVS, 4CVS (2004-03-01)
New Comment:
I also hit this bug in my own server. I analyzed the bug, and created a
patch for this:
--- php-5.2.6/ext/xmlrpc/xmlrpc-epi-php.c Mon Dec 31 16:20:14 2007
+++ xmlrpc-epi-php.c Fri May 2 22:41:30 2008
@@ -859,6 +859,20 @@
zval* callback_params[3];
TSRMLS_FETCH();
+ const char* methodname = XMLRPC_RequestGetMethodName(xRequest);
+ zval **php_function;
+ if (!methodname) { methodname = ""; }
+ Z_STRVAL_P(pData->xmlrpc_method) = estrdup(methodname);
+ Z_STRLEN_P(pData->xmlrpc_method) = strlen(methodname);
+ Z_TYPE_P(pData->xmlrpc_method) = IS_STRING;
+ pData->php_executed = 0;
+ if(zend_hash_find(Z_ARRVAL_P(pData->server->method_map),
+ Z_STRVAL_P(pData->xmlrpc_method),
+ Z_STRLEN_P(pData->xmlrpc_method) + 1,
+ (void**)&php_function) == SUCCESS) {
+ pData->php_function = *php_function;
+ }
+
/* convert xmlrpc to native php types */
xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest));
@@ -876,7 +890,7 @@
zval_ptr_dtor(&xmlrpc_params);
- return NULL;
+ return PHP_to_XMLRPC(pData->return_data TSRMLS_CC);
}
/* called by the C server when it first receives an introspection
request. We pass this on to
@@ -1017,7 +1031,6 @@
Parses XML requests and call methods */
PHP_FUNCTION(xmlrpc_server_call_method)
{
- xmlrpc_callback_data data = {0};
XMLRPC_REQUEST xRequest;
STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS input_opts;
xmlrpc_server_data* server;
@@ -1048,8 +1061,8 @@
if(xRequest) {
const char* methodname =
XMLRPC_RequestGetMethodName(xRequest);
- zval **php_function;
- XMLRPC_VALUE xAnswer = NULL;
+
+ xmlrpc_callback_data data = {0};
MAKE_STD_ZVAL(data.xmlrpc_method); /* init. very
important. spent
a frustrating day finding this out. */
MAKE_STD_ZVAL(data.return_data);
Z_TYPE_P(data.return_data) = IS_NULL; /* in case value
is never
init'd, we don't dtor to think it is a string or something */
@@ -1060,26 +1073,15 @@
}
/* setup some data to pass to the callback function */
- Z_STRVAL_P(data.xmlrpc_method) = estrdup(methodname);
- Z_STRLEN_P(data.xmlrpc_method) = strlen(methodname);
- Z_TYPE_P(data.xmlrpc_method) = IS_STRING;
data.caller_params = *caller_params;
data.php_executed = 0;
data.server = server;
- /* check if the called method has been previous
registered */
- if(zend_hash_find(Z_ARRVAL_P(server->method_map),
- Z_STRVAL_P(data.xmlrpc_method),
- Z_STRLEN_P(data.xmlrpc_method) + 1,
- (void**)&php_function) == SUCCESS) {
-
- data.php_function = *php_function;
- }
-
/* We could just call the php method directly ourselves
at this
point, but we do this
* with a C callback in case the xmlrpc library ever
implements
some cool usage stats,
* or somesuch.
*/
+ XMLRPC_VALUE xAnswer = NULL;
xAnswer = XMLRPC_ServerCallMethod(server->server_ptr,
xRequest,
&data);
if(xAnswer && out.b_php_out) {
zval_dtor(data.return_data);
@@ -1086,7 +1088,9 @@
FREE_ZVAL(data.return_data);
data.return_data = XMLRPC_to_PHP(xAnswer);
} else if(data.php_executed && !out.b_php_out) {
- xAnswer = PHP_to_XMLRPC(data.return_data
TSRMLS_CC);
+ if(!xAnswer){
+ xAnswer =
PHP_to_XMLRPC(data.return_data TSRMLS_CC);
+ }
}
/* should we return data as xml? */
Previous Comments:
------------------------------------------------------------------------
[2004-03-15 23:35:42] [EMAIL PROTECTED]
It crashes, here's the backtrace with latest CVS checkout:
0x404b9e8c in call_user_function_ex (function_table=0x80b8868,
object_pp=0x0, function_name=0x0,
retval_ptr_ptr=0xbfffc954, param_count=3, params=0x8218104,
no_separation=1, symbol_table=0x0)
at /usr/src/web/php/php4/Zend/zend_execute_API.c:445
445 if (function_name->type==IS_ARRAY) { /* assume
array($obj, $name) couple */
(gdb)
(gdb) bt
#0 0x404b9e8c in call_user_function_ex (function_table=0x80b8868,
object_pp=0x0, function_name=0x0,
retval_ptr_ptr=0xbfffc954, param_count=3, params=0x8218104,
no_separation=1, symbol_table=0x0)
at /usr/src/web/php/php4/Zend/zend_execute_API.c:445
#1 0x404b9d7e in call_user_function (function_table=0x80b8868,
object_pp=0x0, function_name=0x0, retval_ptr=0x8219d0c,
param_count=3, params=0xbfffc990) at
/usr/src/web/php/php4/Zend/zend_execute_API.c:409
#2 0x404774b0 in php_xmlrpc_callback (server=0x821b008,
xRequest=0x8219fa8, data=0xbfffcae0)
at /usr/src/web/php/php4/ext/xmlrpc/xmlrpc-epi-php.c:882
#3 0x404800fc in XMLRPC_ServerCallMethod (server=0x821b008,
request=0x8219fa8, userData=0xbfffcae0)
at /usr/src/web/php/php4/ext/xmlrpc/libxmlrpc/xmlrpc.c:2522
#4 0x4047b147 in xsm_system_multicall_cb (server=0x821b008,
input=0x8219f48, userData=0xbfffcae0)
at /usr/src/web/php/php4/ext/xmlrpc/libxmlrpc/system_methods.c:337
#5 0x404800fc in XMLRPC_ServerCallMethod (server=0x821b008,
request=0x8219f48, userData=0xbfffcae0)
at /usr/src/web/php/php4/ext/xmlrpc/libxmlrpc/xmlrpc.c:2522
#6 0x40477b5d in zif_xmlrpc_server_call_method (ht=3,
return_value=0x8219c0c, this_ptr=0x0, return_value_used=1)
at /usr/src/web/php/php4/ext/xmlrpc/xmlrpc-epi-php.c:1103
#7 0x404d59a8 in execute (op_array=0x8214f1c) at
/usr/src/web/php/php4/Zend/zend_execute.c:1621
------------------------------------------------------------------------
[2004-03-01 07:56:40] tomy at envox dot hr
Description:
------------
When building xmlrpc server, system.multiCall method does not work with
my method but works with "built-in" methods such as system.listMethods
or system.methodHelp.
I have tested this on latest CVS snapshots both for PHP4 and PHP5, on
Suse 8.2.
In following example I have submitted http request sent to server whose
code is presented in "Reproduce code".
I do not get nay response and HTTP connection to server is dropped.
Calling "built-in" methods such as system.listMethods or
system.methodHelp using system.multiCall works OK.
Calling my method ("contact.select") in a straight fashion (without
system.multiCall) works OK here is request and response with headers:
POST /xmlrpc_server.php HTTP/1.0
Content-Type: text/xml
Content-Length: 317
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>contact.select</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>SESSIONID</name>
<value>
<string>1234567890</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
Response received:
replyLine: HTTP/1.1 200 OK
HEADER : Date: Mon, 01 Mar 2004 12:09:59 GMT
HEADER : Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8
Python/2.2.2 PHP/4.3.5RC4-dev
HEADER : X-Powered-By: PHP/4.3.5RC4-dev
HEADER : Content-Length: 375
HEADER : Connection: close
HEADER : Content-Type: text/xml
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>AUTH</name>
<value>
<int>1</int>
</value>
</member>
<member>
<name>SESSIONID</name>
<value>
<string>1234567890</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
Reproduce code:
---------------
<?php
function select_contact($method_name, $params, $app_data)
{
if (count($params) == 0 || !array_key_exists("SESSIONID",
$params[0])) {
return array("AUTH" => 0);
}
return array("AUTH"=>1, "SESSIONID"=>$params[0]["SESSIONID"]);
}
$xmlrpc_server = xmlrpc_server_create();
xmlrpc_server_register_method($xmlrpc_server, "contact.select",
"select_contact");
$request_xml = $HTTP_RAW_POST_DATA;
$response = xmlrpc_server_call_method($xmlrpc_server, $request_xml,
array());
header("Content-Type: text/xml");
header("Content-Length: " . strlen($response));
print $response;
xmlrpc_server_destroy($xmlrpc_server);
?>
Expected result:
----------------
XMLRPC request sent to server:
POST /xmlrpc_server.php HTTP/1.0
Content-Type: text/xml
Content-Length: 837
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>system.multiCall</methodName>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>methodName</name>
<value>
<string>contact.select</string>
</value>
</member>
<member>
<name>params</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>SESSIONID</name>
<value>
<string>1234567890</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</param>
</params>
</methodCall>
I would expect response like this:
replyLine: HTTP/1.1 200 OK
HEADER : Date: Mon, 01 Mar 2004 12:09:59 GMT
HEADER : Server: Apache/1.3.27 (Linux/SuSE) mod_python/2.7.8
Python/2.2.2 PHP/4.3.5RC4-dev
HEADER : X-Powered-By: PHP/4.3.5RC4-dev
HEADER : Content-Length: 694
HEADER : Connection: close
HEADER : Content-Type: text/xml
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>AUTH</name>
<value>
<int>1</int>
</value>
</member>
<member>
<name>SESSIONID</name>
<value>
<string>1234567890</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
Actual result:
--------------
XMLRPC request sent to server:
POST /xmlrpc_server.php HTTP/1.0
Content-Type: text/xml
Content-Length: 837
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>system.multiCall</methodName>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>methodName</name>
<value>
<string>contact.select</string>
</value>
</member>
<member>
<name>params</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>SESSIONID</name>
<value>
<string>1234567890</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</param>
</params>
</methodCall>
After request is sent, HTTP connection is dropped and no response is
received.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=27446&edit=1