rrichards Tue Aug 15 22:45:18 2006 UTC
Added files:
/php-src/ext/xml/tests xml011.phpt
Modified files:
/php-src/ext/xml xml.c
Log:
fix bug #38454 (warning upon disabling handler via xml_set_element_handler)
fix bug #38427 (unicode causes xml_parser to misbehave)
remove need for TSRMLS_FETCH() call
add test
http://cvs.php.net/viewvc.cgi/php-src/ext/xml/xml.c?r1=1.165&r2=1.166&diff_format=u
Index: php-src/ext/xml/xml.c
diff -u php-src/ext/xml/xml.c:1.165 php-src/ext/xml/xml.c:1.166
--- php-src/ext/xml/xml.c:1.165 Wed Aug 2 15:22:56 2006
+++ php-src/ext/xml/xml.c Tue Aug 15 22:45:18 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml.c,v 1.165 2006/08/02 15:22:56 iliaa Exp $ */
+/* $Id: xml.c,v 1.166 2006/08/15 22:45:18 rrichards Exp $ */
#define IS_EXT_MODULE
@@ -74,7 +74,7 @@
static PHP_GINIT_FUNCTION(xml);
static void xml_parser_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
-static void xml_set_handler(zval **, zval **);
+static void xml_set_handler(zval **, zval ** TSRMLS_DC);
inline static unsigned short xml_encode_iso_8859_1(unsigned char);
inline static char xml_decode_iso_8859_1(unsigned short);
inline static unsigned short xml_encode_us_ascii(unsigned char);
@@ -371,7 +371,7 @@
/* }}} */
/* {{{ xml_set_handler() */
-static void xml_set_handler(zval **handler, zval **data)
+static void xml_set_handler(zval **handler, zval **data TSRMLS_DC)
{
/* If we have already a handler, release it */
if (*handler) {
@@ -380,9 +380,13 @@
/* IS_ARRAY might indicate that we're using array($obj, 'method')
syntax */
if (Z_TYPE_PP(data) != IS_ARRAY) {
- TSRMLS_FETCH();
-
convert_to_text_ex(data);
+ if (((Z_TYPE_PP(data)==IS_UNICODE) && (Z_USTRLEN_PP(data) ==
0)) ||
+ ((Z_TYPE_PP(data)==IS_STRING) && (Z_STRLEN_PP(data) ==
0))) {
+
+ *handler = NULL;
+ return;
+ }
}
zval_add_ref(data);
@@ -859,6 +863,25 @@
} else {
zval *tag;
+ zval **curtag, **mytype, **myval;
+ HashPosition hpos=NULL;
+
+
zend_hash_internal_pointer_end_ex(Z_ARRVAL_P(parser->data), &hpos);
+
+ if (hpos &&
(zend_hash_get_current_data_ex(Z_ARRVAL_P(parser->data), (void **) &curtag,
&hpos) == SUCCESS)) {
+ if
(zend_hash_find(Z_ARRVAL_PP(curtag),"type",sizeof("type"),(void **) &mytype) ==
SUCCESS) {
+ if
(!strcmp(Z_STRVAL_PP(mytype), "cdata")) {
+ if
(zend_hash_find(Z_ARRVAL_PP(curtag),"value",sizeof("value"),(void **) &myval)
== SUCCESS) {
+ int
newlen = Z_STRLEN_PP(myval) + decoded_len;
+
Z_STRVAL_PP(myval) = erealloc(Z_STRVAL_PP(myval),newlen+1);
+
strcpy(Z_STRVAL_PP(myval) + Z_STRLEN_PP(myval),decoded_value);
+
Z_STRLEN_PP(myval) += decoded_len;
+
efree(decoded_value);
+ return;
+ }
+ }
+ }
+ }
MAKE_STD_ZVAL(tag);
@@ -1158,8 +1181,8 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->startElementHandler, shdl);
- xml_set_handler(&parser->endElementHandler, ehdl);
+ xml_set_handler(&parser->startElementHandler, shdl TSRMLS_CC);
+ xml_set_handler(&parser->endElementHandler, ehdl TSRMLS_CC);
XML_SetElementHandler(parser->parser, _xml_startElementHandler,
_xml_endElementHandler);
RETVAL_TRUE;
}
@@ -1178,7 +1201,7 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->characterDataHandler, hdl);
+ xml_set_handler(&parser->characterDataHandler, hdl TSRMLS_CC);
XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler);
RETVAL_TRUE;
}
@@ -1197,7 +1220,7 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->processingInstructionHandler, hdl);
+ xml_set_handler(&parser->processingInstructionHandler, hdl TSRMLS_CC);
XML_SetProcessingInstructionHandler(parser->parser,
_xml_processingInstructionHandler);
RETVAL_TRUE;
}
@@ -1215,7 +1238,7 @@
}
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->defaultHandler, hdl);
+ xml_set_handler(&parser->defaultHandler, hdl TSRMLS_CC);
XML_SetDefaultHandler(parser->parser, _xml_defaultHandler);
RETVAL_TRUE;
}
@@ -1234,7 +1257,7 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->unparsedEntityDeclHandler, hdl);
+ xml_set_handler(&parser->unparsedEntityDeclHandler, hdl TSRMLS_CC);
XML_SetUnparsedEntityDeclHandler(parser->parser,
_xml_unparsedEntityDeclHandler);
RETVAL_TRUE;
}
@@ -1252,7 +1275,7 @@
}
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->notationDeclHandler, hdl);
+ xml_set_handler(&parser->notationDeclHandler, hdl TSRMLS_CC);
XML_SetNotationDeclHandler(parser->parser, _xml_notationDeclHandler);
RETVAL_TRUE;
}
@@ -1270,7 +1293,7 @@
}
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->externalEntityRefHandler, hdl);
+ xml_set_handler(&parser->externalEntityRefHandler, hdl TSRMLS_CC);
XML_SetExternalEntityRefHandler(parser->parser, (void *)
_xml_externalEntityRefHandler);
RETVAL_TRUE;
}
@@ -1289,7 +1312,7 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->startNamespaceDeclHandler, hdl);
+ xml_set_handler(&parser->startNamespaceDeclHandler, hdl TSRMLS_CC);
XML_SetStartNamespaceDeclHandler(parser->parser,
_xml_startNamespaceDeclHandler);
RETVAL_TRUE;
}
@@ -1308,7 +1331,7 @@
ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser",
le_xml_parser);
- xml_set_handler(&parser->endNamespaceDeclHandler, hdl);
+ xml_set_handler(&parser->endNamespaceDeclHandler, hdl TSRMLS_CC);
XML_SetEndNamespaceDeclHandler(parser->parser,
_xml_endNamespaceDeclHandler);
RETVAL_TRUE;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/xml/tests/xml011.phpt?view=markup&rev=1.1
Index: php-src/ext/xml/tests/xml011.phpt
+++ php-src/ext/xml/tests/xml011.phpt
--TEST--
XML Parser test: concat character data and set empty handlers
--SKIPIF--
<?php
require_once("skipif.inc");
?>
--FILE--
<?php
function start_elem($parser,$name,$attribs) {
echo "<$name>";
}
function end_elem()
{
echo "</$name>";
}
$xml = '<text>start<b /> This & that</text>';
$parser = xml_parser_create();
xml_parse_into_struct($parser, $xml, $vals, $index);
print_r($vals);
xml_parser_free($parser);
echo "\nChange to empty end handler\n";
$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_set_element_handler($parser,'start_elem','end_elem');
xml_set_element_handler($parser,'start_elem',NULL);
xml_parse($parser, $xml, TRUE);
xml_parser_free($parser);
echo "\nDone\n";
?>
--EXPECT--
Array
(
[0] => Array
(
[tag] => TEXT
[type] => open
[level] => 1
[value] => start
)
[1] => Array
(
[tag] => B
[type] => complete
[level] => 2
)
[2] => Array
(
[tag] => TEXT
[value] => This & that
[type] => cdata
[level] => 1
)
[3] => Array
(
[tag] => TEXT
[type] => close
[level] => 1
)
)
Change to empty end handler
<text><b>
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php