@@ -471,13 +471,13 @@ XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *m
471
471
}
472
472
473
473
php_libxml_sanitize_parse_ctxt_options (parser -> parser );
474
- xmlCtxtUseOptions (parser -> parser , XML_PARSE_OLDSAX );
474
+ xmlCtxtUseOptions (parser -> parser , XML_PARSE_OLDSAX | XML_PARSE_NOENT );
475
475
476
- parser -> parser -> replaceEntities = 1 ;
477
476
parser -> parser -> wellFormed = 0 ;
478
477
if (sep != NULL ) {
478
+ /* Note: sax2 flag will be set due to the magic number in `initialized` in php_xml_compat_handlers */
479
+ ZEND_ASSERT (parser -> parser -> sax -> initialized == XML_SAX2_MAGIC );
479
480
parser -> use_namespace = 1 ;
480
- parser -> parser -> sax2 = 1 ;
481
481
parser -> _ns_separator = xmlStrdup (sep );
482
482
} else {
483
483
/* Reset flag as XML_SAX2_MAGIC is needed for xmlCreatePushParserCtxt
@@ -563,10 +563,14 @@ XML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler en
563
563
PHP_XML_API int
564
564
XML_Parse (XML_Parser parser , const XML_Char * data , int data_len , int is_final )
565
565
{
566
- int error ;
566
+ int error = xmlParseChunk ( parser -> parser , ( char * ) data , data_len , is_final ) ;
567
567
568
- error = xmlParseChunk (parser -> parser , (char * ) data , data_len , is_final );
569
- return !error && parser -> parser -> lastError .level <= XML_ERR_WARNING ;
568
+ if (!error ) {
569
+ const xmlError * error_data = xmlCtxtGetLastError (parser -> parser );
570
+ return !error_data || error_data -> level <= XML_ERR_WARNING ;
571
+ }
572
+
573
+ return 0 ;
570
574
}
571
575
572
576
PHP_XML_API int
@@ -705,8 +709,21 @@ XML_GetCurrentColumnNumber(XML_Parser parser)
705
709
PHP_XML_API int
706
710
XML_GetCurrentByteIndex (XML_Parser parser )
707
711
{
708
- return parser -> parser -> input -> consumed +
709
- (parser -> parser -> input -> cur - parser -> parser -> input -> base );
712
+ /* We have to temporarily disable the encoder to satisfy the note from the manual:
713
+ * "This function returns byte index according to UTF-8 encoded text disregarding if input is in another encoding."
714
+ * Although that should probably be corrected at one point? (TODO) */
715
+ xmlCharEncodingHandlerPtr encoder = NULL ;
716
+ xmlParserInputPtr input = parser -> parser -> input ;
717
+ if (input -> buf ) {
718
+ encoder = input -> buf -> encoder ;
719
+ input -> buf -> encoder = NULL ;
720
+ }
721
+ long result = xmlByteConsumed (parser -> parser );
722
+ if (encoder ) {
723
+ input -> buf -> encoder = encoder ;
724
+ }
725
+ /* TODO: at one point this should return long probably to make sure that files greater than 2 GiB are handled correctly. */
726
+ return (int ) result ;
710
727
}
711
728
712
729
PHP_XML_API int
0 commit comments