diff options
-rw-r--r-- | ext/xmlrpc/tests/bug47818.phpt | 39 | ||||
-rw-r--r-- | ext/xmlrpc/xmlrpc-epi-php.c | 4 |
2 files changed, 41 insertions, 2 deletions
diff --git a/ext/xmlrpc/tests/bug47818.phpt b/ext/xmlrpc/tests/bug47818.phpt new file mode 100644 index 0000000000..57e1090303 --- /dev/null +++ b/ext/xmlrpc/tests/bug47818.phpt @@ -0,0 +1,39 @@ +--TEST-- +Bug #47818 (Segfault due to bound callback param) +--FILE-- +<?php + +class MyXmlRpc { + private $s; + private $method; + + function impl($method_name, $params, $user_data){ + $this->method = $method_name; + print "Inside impl(): {$this->method}\n"; + return array_sum($params); + } + + function __construct() { + $this->s = xmlrpc_server_create(); + xmlrpc_server_register_method($this->s, 'add', array($this, 'impl')); + } + + function call($req) { + return xmlrpc_server_call_method($this->s, $req, null); + } + + function getMethod() {return $this->method;} + +} + +$x = new MyXmlRpc; +$resp = $x->call(xmlrpc_encode_request('add', array(1, 2, 3))); + +$method = $x->getMethod(); + +print "Global scope: $method\n"; + +?> +--EXPECTF-- +Inside impl(): add +Global scope: add diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index e365b76142..d3742e8cc3 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -1157,8 +1157,8 @@ PHP_FUNCTION(xmlrpc_server_call_method) } /* cleanup after ourselves. what a sty! */ - zval_dtor(data.xmlrpc_method); - FREE_ZVAL(data.xmlrpc_method); + zval_ptr_dtor(&data.xmlrpc_method); + zval_dtor(data.return_data); FREE_ZVAL(data.return_data); |