dmitry Mon Jul 10 07:41:52 2006 UTC
Modified files:
/php-src/ext/soap php_packet_soap.c soap.c
/php-src/ext/soap/tests/bugs bug38005.phpt
Log:
Fixed bug #38005 (SoapFault faultstring doesn't follow encoding rules)
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_packet_soap.c?r1=1.43&r2=1.44&diff_format=u
Index: php-src/ext/soap/php_packet_soap.c
diff -u php-src/ext/soap/php_packet_soap.c:1.43
php-src/ext/soap/php_packet_soap.c:1.44
--- php-src/ext/soap/php_packet_soap.c:1.43 Sun Jan 1 13:09:53 2006
+++ php-src/ext/soap/php_packet_soap.c Mon Jul 10 07:41:52 2006
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_packet_soap.c,v 1.43 2006/01/01 13:09:53 sniper Exp $ */
+/* $Id: php_packet_soap.c,v 1.44 2006/07/10 07:41:52 dmitry Exp $ */
#include "php_soap.h"
@@ -191,12 +191,16 @@
tmp = get_node(fault->children,"faultstring");
if (tmp != NULL && tmp->children != NULL) {
- faultstring = tmp->children->content;
+ zval *zv =
master_to_zval(get_conversion(IS_STRING), tmp);
+ faultstring = Z_STRVAL_P(zv);
+ FREE_ZVAL(zv);
}
tmp = get_node(fault->children,"faultactor");
if (tmp != NULL && tmp->children != NULL) {
- faultactor = tmp->children->content;
+ zval *zv =
master_to_zval(get_conversion(IS_STRING), tmp);
+ faultactor = Z_STRVAL_P(zv);
+ FREE_ZVAL(zv);
}
tmp = get_node(fault->children,"detail");
@@ -217,7 +221,9 @@
/* TODO: lang attribute */
tmp = get_node(tmp->children,"Text");
if (tmp != NULL && tmp->children != NULL) {
- faultstring = tmp->children->content;
+ zval *zv =
master_to_zval(get_conversion(IS_STRING), tmp);
+ faultstring = Z_STRVAL_P(zv);
+ FREE_ZVAL(zv);
}
}
@@ -227,6 +233,12 @@
}
}
add_soap_fault(this_ptr, faultcode, faultstring, faultactor,
details TSRMLS_CC);
+ if (faultstring) {
+ efree(faultstring);
+ }
+ if (faultactor) {
+ efree(faultactor);
+ }
#ifdef ZEND_ENGINE_2
if (details) {
details->refcount--;
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/soap.c?r1=1.191&r2=1.192&diff_format=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.191 php-src/ext/soap/soap.c:1.192
--- php-src/ext/soap/soap.c:1.191 Sat Jun 3 11:19:43 2006
+++ php-src/ext/soap/soap.c Mon Jul 10 07:41:52 2006
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: soap.c,v 1.191 2006/06/03 11:19:43 mike Exp $ */
+/* $Id: soap.c,v 1.192 2006/07/10 07:41:52 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -3731,20 +3731,12 @@
efree(str);
}
if (zend_hash_find(prop, "faultstring",
sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
- int new_len;
- xmlNodePtr node = xmlNewNode(NULL,
"faultstring");
- char *str =
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0,
NULL TSRMLS_CC);
- xmlAddChild(param, node);
- xmlNodeSetContentLen(node, str, new_len);
- efree(str);
+ xmlNodePtr node =
master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+ xmlNodeSetName(node, "faultstring");
}
if (zend_hash_find(prop, "faultactor",
sizeof("faultactor"), (void**)&tmp) == SUCCESS) {
- int new_len;
- xmlNodePtr node = xmlNewNode(NULL,
"faultactor");
- char *str =
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0,
NULL TSRMLS_CC);
- xmlAddChild(param, node);
- xmlNodeSetContentLen(node, str, new_len);
- efree(str);
+ xmlNodePtr node =
master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+ xmlNodeSetName(node, "faultactor");
}
detail_name = "detail";
} else {
@@ -3762,12 +3754,10 @@
efree(str);
}
if (zend_hash_find(prop, "faultstring",
sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
- int new_len;
xmlNodePtr node = xmlNewChild(param, ns,
"Reason", NULL);
- char *str =
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0,
NULL TSRMLS_CC);
- node = xmlNewChild(node, ns, "Text", NULL);
- xmlNodeSetContentLen(node, str, new_len);
- efree(str);
+ node = master_to_xml(get_conversion(IS_STRING),
*tmp, SOAP_LITERAL, node);
+ xmlNodeSetName(node, "Text");
+ xmlSetNs(node, ns);
}
detail_name = SOAP_1_2_ENV_NS_PREFIX":Detail";
}
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug38005.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/soap/tests/bugs/bug38005.phpt
diff -u /dev/null php-src/ext/soap/tests/bugs/bug38005.phpt:1.2
--- /dev/null Mon Jul 10 07:41:52 2006
+++ php-src/ext/soap/tests/bugs/bug38005.phpt Mon Jul 10 07:41:52 2006
@@ -0,0 +1,41 @@
+--TEST--
+Bug #38005 (SoapFault faultstring doesn't follow encoding rules)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+function Test($param) {
+ return new SoapFault('Test', 'This is our fault: Ä');
+}
+
+class TestSoapClient extends SoapClient {
+ function __construct($wsdl, $opt) {
+ parent::__construct($wsdl, $opt);
+ $this->server = new SoapServer($wsdl, $opt);
+ $this->server->addFunction('Test');
+ }
+
+ function __doRequest($request, $location, $action, $version) {
+ ob_start();
+ $this->server->handle($request);
+ $response = ob_get_contents();
+ ob_end_clean();
+ return $response;
+ }
+}
+
+$client = new TestSoapClient(NULL, array(
+ 'encoding' => 'ISO-8859-1',
+ 'uri' => "test://",
+ 'location' => "test://",
+ 'soap_version'=>SOAP_1_2,
+ 'trace'=>1,
+ 'exceptions'=>0));
+$res = $client->Test();
+echo($res->faultstring."\n");
+echo($client->__getLastResponse());
+?>
+--EXPECT--
+This is our fault: Ä
+<?xml version="1.0" encoding="UTF-8"?>
+<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Body><env:Fault><env:Code><env:Value>Test</env:Value></env:Code><env:Reason><env:Text>This
is our fault: Ã</env:Text></env:Reason></env:Fault></env:Body></env:Envelope>
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php