rrichards               Tue Aug 15 22:47:11 2006 UTC

  Added files:                 (Branch: PHP_5_2)
    /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)
  add test
  
http://cvs.php.net/viewvc.cgi/php-src/ext/xml/xml.c?r1=1.157.2.4.2.2&r2=1.157.2.4.2.3&diff_format=u
Index: php-src/ext/xml/xml.c
diff -u php-src/ext/xml/xml.c:1.157.2.4.2.2 php-src/ext/xml/xml.c:1.157.2.4.2.3
--- php-src/ext/xml/xml.c:1.157.2.4.2.2 Wed Aug  2 15:21:54 2006
+++ php-src/ext/xml/xml.c       Tue Aug 15 22:47:10 2006
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: xml.c,v 1.157.2.4.2.2 2006/08/02 15:21:54 iliaa Exp $ */
+/* $Id: xml.c,v 1.157.2.4.2.3 2006/08/15 22:47:10 rrichards Exp $ */
 
 #define IS_EXT_MODULE
 
@@ -380,7 +380,12 @@
 
        /* IS_ARRAY might indicate that we're using array($obj, 'method') 
syntax */
        if (Z_TYPE_PP(data) != IS_ARRAY) {
+
                convert_to_string_ex(data);
+               if (Z_STRLEN_PP(data) == 0) {
+                       *handler = NULL;
+                       return;
+               }
        }
 
        zval_add_ref(data);
@@ -857,6 +862,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);
                                        

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 &amp; 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

Reply via email to