@@ -69,6 +69,10 @@ ZEND_GET_MODULE(xml)
69
69
#endif /* COMPILE_DL_XML */
70
70
/* }}} */
71
71
72
+
73
+ #define SKIP_TAGSTART (str ) ((str) + (parser->toffset > strlen(str) ? strlen(str) : + parser->toffset))
74
+
75
+
72
76
/* {{{ function prototypes */
73
77
PHP_MINIT_FUNCTION (xml );
74
78
PHP_MINFO_FUNCTION (xml );
@@ -729,7 +733,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch
729
733
730
734
if (!Z_ISUNDEF (parser -> startElementHandler )) {
731
735
ZVAL_COPY (& args [0 ], & parser -> index );
732
- ZVAL_STRING (& args [1 ], ZSTR_VAL (tag_name ) + parser -> toffset );
736
+ ZVAL_STRING (& args [1 ], SKIP_TAGSTART ( ZSTR_VAL (tag_name )) );
733
737
array_init (& args [2 ]);
734
738
735
739
while (attributes && * attributes ) {
@@ -760,7 +764,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch
760
764
761
765
_xml_add_to_info (parser , ZSTR_VAL (tag_name ) + parser -> toffset );
762
766
763
- add_assoc_string (& tag , "tag" , ZSTR_VAL (tag_name ) + parser -> toffset ); /* cast to avoid gcc-warning */
767
+ add_assoc_string (& tag , "tag" , SKIP_TAGSTART ( ZSTR_VAL (tag_name )) ); /* cast to avoid gcc-warning */
764
768
add_assoc_string (& tag , "type" , "open" );
765
769
add_assoc_long (& tag , "level" , parser -> level );
766
770
@@ -814,7 +818,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name)
814
818
815
819
if (!Z_ISUNDEF (parser -> endElementHandler )) {
816
820
ZVAL_COPY (& args [0 ], & parser -> index );
817
- ZVAL_STRING (& args [1 ], ZSTR_VAL (tag_name ) + parser -> toffset );
821
+ ZVAL_STRING (& args [1 ], SKIP_TAGSTART ( ZSTR_VAL (tag_name )) );
818
822
819
823
xml_call_handler (parser , & parser -> endElementHandler , parser -> endElementPtr , 2 , args , & retval );
820
824
zval_ptr_dtor (& retval );
@@ -830,7 +834,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name)
830
834
831
835
_xml_add_to_info (parser , ZSTR_VAL (tag_name ) + parser -> toffset );
832
836
833
- add_assoc_string (& tag , "tag" , ZSTR_VAL (tag_name ) + parser -> toffset ); /* cast to avoid gcc-warning */
837
+ add_assoc_string (& tag , "tag" , SKIP_TAGSTART ( ZSTR_VAL (tag_name )) ); /* cast to avoid gcc-warning */
834
838
add_assoc_string (& tag , "type" , "close" );
835
839
add_assoc_long (& tag , "level" , parser -> level );
836
840
@@ -924,9 +928,9 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
924
928
if (parser -> level <= XML_MAXLEVEL && parser -> level > 0 ) {
925
929
array_init (& tag );
926
930
927
- _xml_add_to_info (parser ,parser -> ltags [parser -> level - 1 ] + parser -> toffset );
931
+ _xml_add_to_info (parser ,SKIP_TAGSTART ( parser -> ltags [parser -> level - 1 ]) );
928
932
929
- add_assoc_string (& tag , "tag" , parser -> ltags [parser -> level - 1 ] + parser -> toffset );
933
+ add_assoc_string (& tag , "tag" , SKIP_TAGSTART ( parser -> ltags [parser -> level - 1 ]) );
930
934
add_assoc_str (& tag , "value" , decoded_value );
931
935
add_assoc_string (& tag , "type" , "cdata" );
932
936
add_assoc_long (& tag , "level" , parser -> level );
@@ -1605,6 +1609,10 @@ PHP_FUNCTION(xml_parser_set_option)
1605
1609
case PHP_XML_OPTION_SKIP_TAGSTART :
1606
1610
convert_to_long_ex (val );
1607
1611
parser -> toffset = Z_LVAL_P (val );
1612
+ if (parser -> toffset < 0 ) {
1613
+ php_error_docref (NULL TSRMLS_CC , E_NOTICE , "tagstart ignored ");
1614
+ parser -> toffset = 0 ;
1615
+ }
1608
1616
break ;
1609
1617
case PHP_XML_OPTION_SKIP_WHITE :
1610
1618
convert_to_long_ex (val );
0 commit comments